我正在使用 .Net 4.5,我的服务是使用异步编写的并返回 Task<>。
当我从客户端调用服务时,我使用等待。
当服务在等待之后返回时,如果客户端代码调用另一个非异步操作,则似乎通道被阻塞。
示例代码:
value = await Service.InitAsync();
Service.SyncOperation(); // Further callbacks/return values from Server are blocked and this statement never returns
(在我看来,异步/等待的全部意义在于允许我在一个方法中编写完整的流程,并让框架处理线程和回调)
我可以通过使用新任务和 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.
我的问题是,有没有其他方法可以在不将服务调用包装在客户端中的情况下做到这一点?也许服务中的某些属性或属性?
谢谢