我正在尝试在我的WCF服务中实现异步模式。调用BeginMethod
,但从不调用相应的EndMethod
。调试服务器,在各个地方放置断点我注意到传递给BeginMethod
的回调永远不会返回。我怀疑这就是为什么永远不会调用EndMethod
的原因。
服务器代码的结构如下:
IAsyncResult BeginMethod([params], AsyncCallback callback, object asyncState)
{
var task = Task<MyReturnType>.Factory.StartNew(()=>
{
//Do work here
return value;
});
return task.ContinueWith(r=>
{
callback(task);
return r;
});
}
MyReturnType EndMethod(IAsyncResult asyncResult)
{
return ((Task<MyReturnType>)asyncResult).Result;
}
我的EndMethod
中的断点永远不会到达,而callback(task);
行永远不会返回。
答案 0 :(得分:0)
问题是回调期望IAsyncResult
在Task<string>
的实例中包含传递给BeginMethod
的状态对象,老实说这应该是显而易见的,但我错过了它。 StarNew
和ContinueWith
的不同重载可以解决问题。发布我的解决方案,以便为某人节省一些头痛。
IAsyncResult BeginMethod([params], AsyncCallback callback, object asyncState)
{
var task = Task<MyReturnType>.Factory.StartNew((s)=>
{
//Do work here
return value;
}, state);
return task.ContinueWith((t, s)=>
{
callback(t);
return t.Result;
});
}
MyReturnType EndMethod(IAsyncResult asyncResult)
{
return ((Task<MyReturnType>)asyncResult).Result;
}