因此我不能使用线程仿射锁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(); }
}
}
Run Code Online (Sandbox Code Playgroud)
如果由Mutex保护的moethod是同步的,那么上面的代码将起作用,但async我会得到:
从不同步的代码块调用对象同步方法.
Named Mutex对异步代码没用吗?
我正在编写一个程序,从网站下载游戏作为zip存档并提取它们.由于所有游戏在被提取之前都被下载到同一位置,因此我在使用Mutex时可以防止同时进行两次下载时的竞争条件.问题是我得到一个System.ApplicationException抛出说:"对象同步方法是从一个不同步的代码块调用的." 我所看到的一切都说这是因为从不拥有它的线程中释放Mutex.但是,我的代码等待并在同一个线程中释放互斥锁.
await Task.Run(async () =>
{
mutex.WaitOne();
await DownloadGameAsync(ug, nvm);
await ExtractGameAsync(ug, nvm);
nvm.Action = "Done";
mutex.ReleaseMutex();
});
Run Code Online (Sandbox Code Playgroud)
如果我在线上放置一个断点mutex.ReleaseMutex(); 并且跳过该行不会导致抛出异常,但是删除断点并正常运行会导致每次执行都出现异常.
我应该以不同的方式接近(信号量)还是使用async/await导致问题?
I am trying to get the response from a url, and when I use the await and async in my function, my Mutex throws an error.
Error output :
System.ApplicationException
Object synchronization method was called from an unsynchronized block of code.
at System.Threading.Mutex.ReleaseMutex()
Run Code Online (Sandbox Code Playgroud)
Code :
private async void getData ()
{
_mutex.WaitOne();
try
{
string url = "https://urllink.com";
HttpClient client = new HttpClient();
string response = await client.GetStringAsync(url);
}
catch (Exception e)
{
// TODO
throw e;
}
_mutex.ReleaseMutex();
}
Run Code Online (Sandbox Code Playgroud)