等待模态表单关闭

时间:2018-03-07 11:10:19

标签: c# winforms

我想要实现的是创建一个modaless窗口模态而不先隐藏它。 这是开始的工作:

form.Show();
// do preparation stuff and display in form
form.Visible = false;
form.ShowDialog();
// Cleanup application logic and exit gracefully

正在运行的任务在后台执行实际工作。表单用于显示事件日志。

我想要的是避免隐藏表单并将其再次显示为模态对话框。我尝试了什么(linqpad片段):

void Main()
{    
    var form = new MyForm();
    form.Show();
    // do stuff
    form.WaitForClose();
}

class MyForm : Form
{ 
    private TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();

    public MyForm()
    {
        this.Closed += (s, e) => tcs.TrySetResult(true);
    }

    public void WaitForClose()
    {
        var r = tcs.Task.Result;
    }
}

但是这段代码是封锁的。

这个有用,但我想让它更简单:

void Main()
{
    var form = new MyForm();
    Task.Factory.StartNew(() =>
    {
        form.WaitToLoad();
        // do preparation stuff and display in form
        Task.Factory.StartNew(() => {
           // do bakcground stuff
        });
        form.WaitToClose();
        // Cleanup application logic and exit gracefully
    });
    form.ShowDialog();      
}

class MyForm : Form
{ 
    private EventWaitHandle _loadWaitHandle = new AutoResetEvent (false);   
    private EventWaitHandle _closeWaitHandle = new AutoResetEvent (false);  

    public MyForm()
    {
        this.Load += (s,e) => _loadWaitHandle.Set();
        this.Closed += (s, e) => _closeWaitHandle.Set();
    }

    public void WaitToClose()
    {
        _closeWaitHandle.WaitOne();
    }

    public void WaitToLoad()
    {
        _loadWaitHandle.WaitOne(); 
    }
}

我觉得我错过了一些明显的东西。

1 个答案:

答案 0 :(得分:0)

在任务上调用.Result将阻止,直到可以解析结果。尝试将方法更改为此类

public async Task WaitForClose()
{
    var r = await tcs.Task;
}

等待对此的调用,等待此操作完成后,它将等待其他操作。