从async void Form.Load创建的表单另一个Form的事件处理程序

时间:2017-07-27 23:30:40

标签: c# forms winforms asynchronous async-await

我有一个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
}

0 个答案:

没有答案