我正在玩弄 Windows 8 项目的异步服务,并且该服务有一些异步调用,一次只能调用一次。
public async Task CallThisOnlyOnce()
{
PropagateSomeEvents();
await SomeOtherMethod();
PropagateDifferentEvents();
}
由于您无法将异步调用封装在锁定语句中,因此我想到了使用该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
只会同时执行一次调用,并且多个等待者会挂接到同一个任务上。
这是一种“有效”的做法,还是这种方法有一些缺点?