私はWindows8プロジェクトの非同期サービスをいじっていますが、このサービスの非同期呼び出しがいくつかありますが、一度に1回だけ呼び出す必要があります。
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
は同時に1回だけ実行され、複数の待機者が同じタスクにフックすることになります。
これはこれを行うための「有効な」方法ですか、それともこのアプローチにはいくつかの欠点がありますか?