4

私が達成する必要があるのは:

  1. MasterAsync の実行中は、HumbleSlave1Async と HumbleSlave2Async は実行できません。
  2. 逆-一方または両方のスレーブが実行されている場合、MasterAsync は実行できません。
  3. 難しい部分 - スレーブはお互いをブロックできません。

(使用されているAsyncLockへのリンク)。

    private async Task MasterAsync()
    {
        using (await _asyncLock.LockAsync())
        {
            await Task.Delay(2000);
        }
    }
    private async Task HumbleSlave1Async()
    {
        using (await _asyncLock.LockAsync())
        {
            await Task.Delay(5000);
        }
    }
    private async Task HumbleSlave2Async()
    {
        using (await _asyncLock.LockAsync())
        {
            await Task.Delay(5000);
        }
    }

それを解決する方法がわかりません.MasterAsyncの各スレーブに2つの異なるロックを使用することを考えていましたが、1つのロックが別のロックになります:

    private async Task MasterAsync()
    {
        using (await _asyncLock1.LockAsync())
        {
            using (await _asyncLock2.LockAsync())
            {
                await Task.Delay(2000);
            }
        }
    }
    private async Task HumbleSlave1Async()
    {
        using (await _asyncLock1.LockAsync())
        {
            await Task.Delay(5000);
        }
    }
    private async Task HumbleSlave2Async()
    {
        using (await _asyncLock2.LockAsync())
        {
            await Task.Delay(5000);
        }
    }

特に AsyncLock を使用した場合、それは意味があり、安全ですか(デッドロックなど)?

4

3 に答える 3

1

あなたのアプローチで考えられる問題は、HumbleSlave2Asyncが実行MasterAsyncされ、呼び出され、取得され、asyncLock1待機しているasyncLock2場合、実行できないことですHumbleSlave1Async(asyncLock1によって取得されるためMasterAsync)。したがって、条件 3 は満たされません。

おそらく、これを機能させるにはAsyncManualResetEventのようなものを使用する必要があります。

于 2013-10-21T12:04:55.933 に答える