【发布时间】:2010-12-21 02:20:02
【问题描述】:
出于某种原因,我需要在单独的线程上执行 BeginReceive,就像这个例子:
public void WaitForData()
{
Thread t = new Thread(WaitForDataThread);
t.Start();
}
public void WaitForDataThread()
{
try
{
CSocketPacket theSocPkt = new CSocketPacket();
theSocPkt.thisSocket = m_socClient;
m_asynResult = m_socClient.BeginReceive(theSocPkt.dataBuffer, 0, theSocPkt.dataBuffer.Length, SocketFlags.None, OnDataReceived, theSocPkt);
}
catch (SocketException se)
{
MessageBox.Show(se.Message);
}
}
但我总是在 BeginReceive 调用后立即收到错误,OnDataReceived 立即引发,在这种情况下它将调用 EndReceive 方法,并且总是抛出此错误:“I/O 操作已中止,因为线程退出或应用程序请求”。
但是如果我删除了分离线程部分(比如直接调用 WaitForDataThread(),而不通过 WaitForData() 方法),一切正常。
如果您想知道为什么我需要创建一个单独的线程,那是因为我需要在事件期间调用 BeginReceive,该事件将由来自不同类的不同线程生成。这与创建一个像上面的示例一样的新线程几乎相同,我需要让它工作。
有没有办法可以做到这一点?
【问题讨论】:
-
我真的不明白为什么要创建一个新线程来启动异步操作?
-
我需要模拟其他类的不同线程事件,所以创建一个新线程并调用 BeginReceive 就像在不同线程生成的事件中调用它一样。
标签: .net sockets asynchronous