我有一个的NetworkStream我读异步(使用异步/等待)异步套接字读取:不能退出启动线程 - 该怎么办?
await Task<int>.Factory.FromAsync((cb, state) => stream.BeginRead(buffer, offset, readLen - offset), stream.EndRead, null);
不幸的是,一个IO异常,有时会出现:“由于线程退出或应用程序请求的I/O操作已中止“。
我相信我达到了Socke.EndReceive记录的要求:http://msdn.microsoft.com/en-us/library/w7wtt64b.aspx。其中说明:
当线程 退出时,由给定线程启动的所有I/O都会被取消。如果线程在操作完成之前退出 ,未决的异步操作可能会失败。
由于异步方法在默认调度程序上运行,因此无法保证此要求。
有没有办法解决这个问题?我是否需要启动专用线程来启动I/O?
最好的问候,德克
您确定适用于异步I/O吗?我们已经在Mindtouch DReAM上使用了多年网络流的Begin/End,并且它始终将启动线程释放回线程池。 –
Hello Arne,这不同于释放非托管线程。据我了解,这种行为的意思是“帮助”:当线程终止时,与其关联的任何工作都将被取消。 这就是说,我有麻烦在我自己的机器上重现它。它发生在构建服务器上,在该服务器上运行数百个测试,每个启动/停止线程以及快速连续创建和卸载appdomains。我看到的SocketException是EndReceive上的SocketError.OperationAborted。 –
看起来我误解了那个页面。这确实是不幸的行为,因为异步点不必担心启动线程。 –