我想要实现的是创建一个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();
}
}
我觉得我错过了一些明显的东西。
答案 0 :(得分:0)
在任务上调用.Result
将阻止,直到可以解析结果。尝试将方法更改为此类
public async Task WaitForClose()
{
var r = await tcs.Task;
}
等待对此的调用,等待此操作完成后,它将等待其他操作。