【发布时间】:2013-01-31 02:55:29
【问题描述】:
图表 1:一些代码将 Async(不是 async!)网络调用包装成 Task
public static Task<byte[]> GetAsync(IConnection connection, uint id)
{
ReadDataJob jobRDO = new ReadDataJob();
//No overload of FromAsync takes 4 extra parameters, so we have to wrap
// Begin in a Func so that it looks like it takes no parameters except
// callback and state
Func<AsyncCallback, object, IAsyncResult> wrapped = (callback, state) =>
jobRDO.Begin(connection, 0, 0, id, callback, state);
return Task<byte[]>.Factory.FromAsync(wrapped, ar =>
{
ErrorCode errorCode;
UInt32 sError;
UInt32 attribute;
byte[] data = new byte[10];
jobRDO.End(out errorCode, out sError, out attribute, out data);
if(error != ErrorCode.NO_ERROR) throw new Exception(error.ToString());
return data;
}, jobRDO);
}
安装 .Net 4.5(不将 VS 指向它,也不重新编译)会停止此工作。永远不会调用回调。
任何想法可能导致此问题,否则,我可以做些什么来尝试进一步缩小问题的根本原因或解决它?
【问题讨论】:
-
找到最后一项,但我不知道如何解释它:FromAsync:"IAsyncResult 实现必须同步完成,其 CompletedSynchronously 属性必须为结果返回 true要完成的任务。”(表中的最后一项)
-
我怀疑这是一个框架版本问题。您是否使用任何网络调试工具?您应该检查它是否至少在执行请求。我用 .net 4.5 做了很多异步包装,没问题!
-
哈哈,看看这个,如果你点击我之前评论中的链接,然后点击“CompleteSynchronously”,文字内容为:“IAsyncResult接口的大多数实现者不会使用这个属性并且应该返回 false。”
-
所以我的包装很幸运,因为它们都返回了 true
标签: c# task-parallel-library .net-4.5