我试图简化对WCF异步操作的调用,方法是使用Task.Factory.FromAsync将调用包装到客户端的一个任务中。但是,当我启动()包装任务时,对Start()的调用会阻塞客户机,直到调试器报告一个ContextSwitchDeadlock。不过,服务器端操作将被正确调用。我遗漏了什么?
WCF合同:
[ServiceContract(Namespace = "urn:test/test")]
public interface ITestContract
{
[OperationContract(AsyncPattern=true)]
IAsyncResult BeginGetResult(AsyncCallback callback, object state);
int EndGetResult(IAsyncResult result);
}客户代码:
var task = Task<int>.Factory.FromAsync(
(callback, state) => service.BeginGetResult(callback, state),
(result) => service.EndGetResult(result)
);
task.Start(); // blocks until ContextSwitchDeadlock gets reported编辑:为了完整起见:不,我不能使用.NET 4.5异步/等待模式,因为.NET 4.0 (即Windows和Server2003Support)对我的项目是一个很难的要求。
EDIT2:
无论如何,对Start()的调用都不应该是必要的。真正的问题是,在我调用Start()、Wait()或Result之前,不会在服务器端调用Start()--这相当于同步调用。
正如我所发现的,这与任务毫无关系。如果我这样做,我会得到同样的结果:
var asyncResult = service.BeginGetResult(null, null); // BeginGetResult NOT invoked on server side!
asyncResult.AsyncWaitHandle.WaitOne(); // Now BeginGetResult actually gets invokedEDIT3:
结果都是我的误会。我期望在客户端调用BeginGetResult将立即调用服务器端的相应BeginGetResult,即客户机端的BeginGetResult将阻塞,直到服务器实际收到请求为止,但情况似乎并非如此。显然,请求是在后台线程中发送的,因此在客户机和服务器端调用BeginGetResult之间可能会出现延迟。我认为这种行为是意料之中的,所以一切都很好:-)。
发布于 2013-02-14 14:29:36
您不需要在由Start创建的Task上调用FromAsync。Start只适用于有代码的任务,而FromAsync任务没有任何代码。
https://stackoverflow.com/questions/14876793
复制相似问题