从不同线程调用同一函数时如何防止竞争条件?

问题描述 投票:0回答:1

希望获得有关如何使用以下代码避免竞争条件的一些指导?

class MyClass
{
    private bool isRunning;

    private async void MyEvent() //EventHandler
    {
        await RunThis();
    }

    private async Task RunThis()
    {
        isRunning = true;

        //Do Some Async Stuff

        isRunning = false;
    }

    public Task DoingSomeOtherStuffOnADifferentThread()
    {
        Task.Run(async () =>
        {
            if (!isRunning)
                await RunThis();
        }
    }
}

预先感谢您的帮助

c# multithreading asynchronous async-await race-condition
1个回答
0
投票

我正在从您尝试的实现中得出所需的行为,在这里:

using System.Threading;
using System.Threading.Tasks;

class MyClass
{
    //private bool isRunning;
    private readonly SemaphoreSlim _lock = new SemaphoreSlim(1,1);

    private async void MyEvent()
    {
        await _lock.WaitAsync();
        try
        {
            await RunThis();
        }
        finally
        {
            _lock.Release();
        }
    }

    private async Task RunThis()
    {
        //isRunning = true;

        //Do Some Async Stuff
        await Task.Delay(100);

        //isRunning = false;
    }

    public Task DoingSomeOtherStuffOnADifferentThread()
    {
        return Task.Run(async () =>
        {
            // if (!isRunning) // trying to do something broadly equivalent:
            if (_lock.CurrentCount <= 0) return;
            await _lock.WaitAsync();
            try{
                await RunThis();
            }
            finally
            {
                _lock.Release();
            }
        });
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.