永远不会调用异步 WCF 服务的结束方法
End method of asyn WCF service is never called
我正在尝试在我的 WCF 服务中实现异步模式。 BeginMethod
被调用,但相应的 EndMethod
从未被调用。调试服务器,在不同的地方放置断点我注意到传递给 BeginMethod
的回调从不 returns。我怀疑这就是为什么从未调用 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);
行从未达到 returns。
问题是回调期望 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;
}
我正在尝试在我的 WCF 服务中实现异步模式。 BeginMethod
被调用,但相应的 EndMethod
从未被调用。调试服务器,在不同的地方放置断点我注意到传递给 BeginMethod
的回调从不 returns。我怀疑这就是为什么从未调用 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);
行从未达到 returns。
问题是回调期望 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;
}