首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WCF AsyncPattern + Task<T>.Factory.FromAsync = ContextSwitchDeadlock

WCF AsyncPattern + Task<T>.Factory.FromAsync = ContextSwitchDeadlock
EN

Stack Overflow用户
提问于 2013-02-14 14:15:34
回答 1查看 1.7K关注 0票数 1

我试图简化对WCF异步操作的调用,方法是使用Task.Factory.FromAsync将调用包装到客户端的一个任务中。但是,当我启动()包装任务时,对Start()的调用会阻塞客户机,直到调试器报告一个ContextSwitchDeadlock。不过,服务器端操作将被正确调用。我遗漏了什么?

WCF合同:

代码语言:javascript
复制
[ServiceContract(Namespace = "urn:test/test")]
public interface ITestContract
{
    [OperationContract(AsyncPattern=true)]
    IAsyncResult BeginGetResult(AsyncCallback callback, object state);

    int EndGetResult(IAsyncResult result);
}

客户代码:

代码语言:javascript
复制
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()--这相当于同步调用。

正如我所发现的,这与任务毫无关系。如果我这样做,我会得到同样的结果:

代码语言:javascript
复制
var asyncResult = service.BeginGetResult(null, null); // BeginGetResult NOT invoked on server side!
asyncResult.AsyncWaitHandle.WaitOne(); // Now BeginGetResult actually gets invoked

EDIT3:

结果都是我的误会。我期望在客户端调用BeginGetResult将立即调用服务器端的相应BeginGetResult,即客户机端的BeginGetResult将阻塞,直到服务器实际收到请求为止,但情况似乎并非如此。显然,请求是在后台线程中发送的,因此在客户机和服务器端调用BeginGetResult之间可能会出现延迟。我认为这种行为是意料之中的,所以一切都很好:-)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-14 14:29:36

您不需要在由Start创建的Task上调用FromAsyncStart只适用于有代码的任务,而FromAsync任务没有任何代码。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14876793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档