WCF使用Async / Await - 在客户端阻止通道

时间:2012-12-30 09:51:34

标签: wcf asynchronous task block

我正在使用.Net 4.5,我的服务是使用Async编写的,并返回Task<>。
当我从客户端呼叫服务时,我使用等待 当await之后服务返回时,如果客户端代码调用另一个非异步操作,则通道被阻止。

示例代码:

value = await Service.InitAsync();
Service.SyncOperation(); // Further callbacks/return values from Server are blocked and this statement never returns

(async / await的全部内容,我认为是允许我在一个方法中编写完整的流程,让框架处理线程和回调)

我能够通过使用新任务包装对服务的调用然后Task.Yield来解决这个问题:

async Task<T> CallAsync<T>(Func<Task<T>> func)
{
    Task<T> t = await func;
    await Task.Yield();
    return t;
}

并在客户端:

value = CallAsync(Service.InitAsync);
Service.SyncOperation(); //Now the server is not blocked since Yield changed back to the client context.

我的问题是,如果没有在客户端中包含服务调用,还有其他方法吗? 也许服务中有一些属性或属性?

由于

0 个答案:

没有答案