1

我试图通过使用 Task.Factory.FromAsync 将调用包装到客户端的任务中来简化对 WCF 异步操作的调用。但是当我 Start() 包装的任务时,对 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 async / await 模式,因为 .NET 4.0(即 Windows XP 和 Server 2003 支持)是我项目的硬性要求。

编辑2:

Start()无论如何都不需要调用 to 。真正的问题是BeginGetResult在我调用之前不会在服务器端调用Start()Wait()或者Result- 这与同步调用相同。

正如我发现的那样,这与任务完全无关。如果我执行以下操作,我会得到相同的结果:

var asyncResult = service.BeginGetResult(null, null); // BeginGetResult NOT invoked on server side!
asyncResult.AsyncWaitHandle.WaitOne(); // Now BeginGetResult actually gets invoked

编辑3:

原来这一切都只是我的一个误会。我希望BeginGetResult在客户端调用会立即调用服务器端的相应调用BeginGetResult,即BeginGetResult客户端会阻塞,直到服务器实际收到请求,但情况似乎并非如此。显然请求是在后台线程中发送的,因此客户端和服务器端调用BeginGetResult. 我想这种行为是可以预料的,所以一切都很好:-)。

4

1 回答 1

3

您不需要调用Startcreated Taskby FromAsyncStart仅适用于有代码的任务,而FromAsync任务没有任何代码。

于 2013-02-14T14:29:36.867 回答