gpt4 book ai didi

c# - 带等待的命名互斥量

转载 作者:可可西里 更新时间:2023-11-01 07:46:55 26 4
gpt4 key购买 nike

因此我不能在 async 中使用线程仿射锁 - 我如何在运行多个进程时保护我的资源?

例如,我有两个使用以下任务的进程:

 public async Task<bool> MutexWithAsync()
{
using (Mutex myMutex = new Mutex(false, "My mutex Name"))
{
try
{
myMutex.WaitOne();
await DoSomething();
return true;
}
catch { return false; }
finally { myMutex.ReleaseMutex(); }
}
}

如果 Mutex 保护的方法是同步的,那么上面的代码可以工作,但是使用 async 我会得到:

Object synchronization method was called from an unsynchronized block of code.

那么 Named Mutex 对异步代码没用吗?

最佳答案

您必须确保在特定线程上一致地访问互斥体。您可以通过多种方式做到这一点:

  1. 不要在持有互斥锁的临界区使用 await
  2. 在只有一个线程的 TaskScheduler 上调用互斥锁

它可能看起来像这样:

await Task.Factory.StartNew(() => mutex.WaitOne(), myCustomTaskScheduler);

或者,您使用同步代码并将所有内容移至线程池。如果您只能访问 DoSomething 的异步版本,请考虑仅对其结果调用 Task.Wait。你会在这里遭受轻微的低效率。可能没问题。

关于c# - 带等待的命名互斥量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23153155/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com