【发布时间】:2012-11-23 13:30:40
【问题描述】:
我正在为 Windows 8 项目使用异步服务,并且该服务有一些异步调用,一次只能调用一次。
public async Task CallThisOnlyOnce()
{
PropagateSomeEvents();
await SomeOtherMethod();
PropagateDifferentEvents();
}
由于您无法将异步调用封装在 lock 语句中,因此我想到了使用 AsyncLock 模式,但我认为我不妨尝试这样的事情:
private Task _callThisOnlyOnce;
public Task CallThisOnlyOnce()
{
if(_callThisOnlyOnce != null && _callThisOnlyOnce.IsCompleted)
_callThisOnlyOnce = null;
if(_callThisOnlyOnce == null)
_callThisOnlyOnce = CallThisOnlyOnceAsync();
return _callThisOnlyOnce;
}
private async Task CallThisOnlyOnceAsync()
{
PropagateSomeEvents();
await SomeOtherMethod();
PropagateDifferentEvents();
}
因此,您最终会得到调用 CallThisOnlyOnceAsync 只同时执行一次,并且多个等待者挂接到同一个任务。
这是一种“有效”的方式吗?还是这种方式有一些缺点?
【问题讨论】:
标签: c# .net-4.0 windows-runtime task-parallel-library .net-4.5