我正在使用.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.
我的问题是,如果没有在客户端中包含服务调用,还有其他方法吗? 也许服务中有一些属性或属性?
由于