希望获得有关如何使用以下代码避免竞争条件的一些指导?
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();
}
}
}
预先感谢您的帮助
我正在从您尝试的实现中得出所需的行为,在这里:
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();
}
});
}
}