Eri*_*and 3 c# multithreading winforms
在我的Windows窗体应用程序中,我有一个子窗体,它由我的主窗体作为模态启动.子表单用作执行长时间运行任务的向导,并包含"取消"按钮.在设计器中,我将此"取消"按钮的DialogResult属性设置为DialogResult.Cancel.但是,如果用户拒绝按下"取消"按钮直到长操作完成,则"取消"按钮的文本变为"关闭".我想按钮的DialogResult是DialogResult.None,如果发生这种情况.
不幸的是,设置似乎并不存在.为了维护响应式UI,长时间运行的任务在一个单独的运行中运行Task,然后在任务完成后的UI更新在一个ContinueWith块之后完成,这反过来用于Invoke执行UI工作.它看起来像这样:
Task.Factory.StartNew(() =>
{
MyStaticClass.DoLotsOfWork(a, b, myCancellationToken);
return MyStaticClass.TellMeAboutIt(a, c, myCancellationToken);
}, myCancellationToken)
.ContinueWith(task =>
{
switch(task.Status)
{
case TaskStatus.RanToCompletion:
Invoke((MethodInvoker)delegate
{
cancelButton.Text = "Close";
cancelButton.DialogResult = DialogResult.None;
// other UI-related stuff.
}
// Other cases here...
}
});
Run Code Online (Sandbox Code Playgroud)
当我运行代码时,文本设置为"关闭",没问题.在DialogResult 似乎改变:如果我穿行使用调试器,调试器告诉我的值已经改变.然而,当在关闭窗口(使用取消/关闭按钮)时,DialogResult返回由myWindow.ShowDialog()是始终 DialogResult.Cancel.
这是一个错误吗?难道我做错了什么?一个人可以在运行DialogResult中以编程方式设置按钮吗?
将DialogResult设置为Cancel的原因不止一个.例如,您可能会在按钮的Click事件处理程序中调用Close().这会关闭窗口,但由于从未分配过DialogResult,Winforms必须假设取消.隐藏窗口是触发此窗口的另一种方式,当窗口不可见时,窗口不能保持模态.必然如此,所有其他窗口都被禁用,最后一个窗口被隐藏,用户再也无法返回程序.
处理对话状态的理智方法是只设置DialogResult属性.只要将其从None更改为其他内容,Winforms将关闭对话框,对话框结果将明确无误.因此,请考虑删除Click事件处理程序并将代码更改为:
case TaskStatus.RanToCompletion:
Invoke((MethodInvoker)delegate
{
cancelButton.Text = "Close";
cancelButton.DialogResult = DialogResult.OK;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
180 次 |
| 最近记录: |