异步套接字读取:不能退出启动线程 - 该怎么办?

Dir*_*nné 6 c# multithreading asynchronous threadpool task-parallel-library

我有一个我异步读取的NetworkStream(使用async/await)

await Task<int>.Factory.FromAsync((cb, state) => stream.BeginRead(buffer, offset, readLen - offset), stream.EndRead, null);
Run Code Online (Sandbox Code Playgroud)

不幸的是,有时会发生io异常:"由于线程退出或应用程序请求,I/O操作已中止."

我相信我达到了Socke.EndReceive中记录的要求:http://msdn.microsoft.com/en-us/library/w7wtt64b.aspx.哪个州:

当该线程退出时,由给定线程启动的所有I/O都将被取消.如果线程在操作完成之前退出,则挂起的异步操作可能会失败.

由于异步方法在默认调度程序上运行,因此无法保证此要求.

有没有解决的办法?我是否需要启动专用线程来启动I/O?

最好的问候,德克

Dir*_*nné 3

我在parallelextensions论坛上问了同样的问题:

http://social.msdn.microsoft.com/Forums/en-US/parallelextensions/thread/d116f7b0-c8ee-4ce4-a9b8-4c38120e45a4

基本上,ThreadPool 不会停止任何具有异步 I/O 挂起的线程。所以只要在ThreadPool上启动socket操作就不会出现这个问题。