我使用了.NET的Socket.BeginReceive方法,当我从EndReceive方法获得数据时,我使用了AutoResetEvent.waitone块-- EndReceive代码线程--我发现BeginReceive无法工作;所有线程都被阻塞;直到计时器完成并发出信号,我可以再次获得数据。BeginReceive不是异步方法吗?
var sock= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.BeginReceive(buffer, 0, 1024, SocketFlags.None, i => {
var sock= (Socket)i.AsyncState;
int readNum=sock.EndReceive(i);
var reset= new AutoResetEvent(false);
Timer timer = new Timer({ Thread.Sleep(1000000000); reset.set() });
reset.WaitOne(Timeout.Infinite);
time.Dispose();
} ,sock);只需配置定时器,我就必须创建新线程等待!!
发布于 2013-08-02 11:12:41
AutoResetEvent,e被封装在一个临时闭包中,因此为处理EndReceive代码而创建的线程将无限期地等待。
最好将代码重构为如下内容:
bool stopped = false;
var timer = null;
void MainFunction()
{
var buffer = new byte[1024];
var sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.BeginReceive(buffer, 0, 1024, SocketFlags.None, new AsyncCallback(ReadCallback), sock);
}
void ReadCallback(IAsyncResult ar)
{
var sock = (Socket)ar.AsyncState;
int readNum = sock.EndReceive(ar);
// begin receiving again as long as we shouldn't be stopped
if (stopped == false)
{
sock.BeginReceive(buffer, 0, 1024, SocketFlags.None, new AsyncCallback(ReadCallback), sock);
}
if (timer == null)
{
Timer timer = new Timer({ Thread.Sleep(1000000000); stopped = true; });
}
}您需要Set您的AutoResetEvent来表示资源是空闲的。我看不出你提供的任何密码。
您可能想看看http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx中的一些示例和文档
https://stackoverflow.com/questions/18014232
复制相似问题