我在寫關鍵區域的應用程序。AutoResetEvent.WaitOne()導致死鎖
我決定使用AutoResetEvent來實現互斥。 下面的代碼
public class MyViewModel
{
private AutoResetEvent lock = new AutoResetEvent(true);
private aync Task CriticalRegion()
{
Dosomething();
}
public async Task Button_Click()
{
Debug.WriteLine("Entering Button_Click");
lock.WaitOne();
try
{
await CriticalRegion();
}
finally
{
lock.Set();
Debug.WriteLine("Leaving Button_Click");
}
}
}
我有一個按鈕,其單擊事件調用Button_Click()
方法
它正常工作。但是,如果我在第一次致電Button_Click()
完成之前再次點擊該按鈕的時間足夠快,則整個應用程序將停止響應。
在調試窗口,我覺得這樣的事情
Entering Button_Click
Entering Button_Click
貌似方法永遠不會完成。
我掙扎了一下,發現如果我改變lock.WaitOne();
到
if (!sync.WaitOne(TimeSpan.FromSeconds(1)))
{
return;
}
在這種情況下,我的應用程序能夠避免僵局,但我不知道爲什麼它的工作原理。
我只知道我的操作系統課程中的IPC和C#中的async
和await
模式,我對.NET中的線程並不熟悉。
我真的很想了解幕後的真實情況。 感謝您的回信;),直到你調用AutoResetEvent.Set()
,你似乎永遠只是後的WaitOne()
呼叫做
張貼的片段不足以證明僵局。但是,你做錯了是顯而易見的,關注類名。它是自動復位*事件*。事件用於發信號,「關鍵區域」需要互相排斥。這需要一個互斥鎖,最容易在C#中用'lock'關鍵字完成。在UI線程上使用鎖定在形式上是非法的,實際上很可能導致死鎖。 –