我有一个async void事件处理程序,它创建一个Form并将它传递给SempahoreSlim,初始计数为0,然后等待它同步(在等待之前显示表单)。当我单击Form中的一个按钮时,信号量被释放,事件处理程序继续在相同的上下文(UIThread)上执行。调试我发现有时当显示Form并调用DefWndProc(由.Net Framework Form类实现内部调用)时,应用程序会冻结。为什么呢?
class DebugForm : Form
{
SemaphoreSlim waitOK;
public DebugForm (SemaphoreSlim waitOK)
{
InitializeComponent();
this.waitOK = waitOK;
}
//Added in InitializeComponent
async void buttonOK_Click(object sender, EventArgs e)
{
//Do stuff with UI
waitOK.Release();
}
}
在我的MainForm加载事件中,我这样做:
async void MainForm_Load(object sender, EventArgs e)
{
SemaphoreSlim sem = new SemaphoreSlim(0);
Form debugForm = new DebugForm(sem);
//It stucks in the Show call sometimes with low probability
debugForm.Show();
await sem.WaitAsync();
//Do other Stuff
}