【发布时间】:2018-02-05 06:59:12
【问题描述】:
在多线程环境中。
我在进度表单中使用 ShowDialog 来阻止其他表单上的所有用户活动。
完成部分过程后,我隐藏了进度表,我做了一些任务并再次显示(ShowDialog)它。
一切正常,但进度表闪烁。
有没有办法在不隐藏窗口的情况下从 ShowDialog 继续,或者可能更好,有没有办法将 Show 转换为 ShowDialog 并再次返回?
编辑
我的代码与此类似
class frmProgress : Form
{
// Standard stuff
public void DoSomeWorks()
{
async Task.Run(() => RunWork1());
ShowDialog();
if (_iLikeTheResultOfWork1)
{
async Task.Run(() => RunWork2());
ShowDialog();
}
}
void RunWork1()
{
// Do a lot of things including update UI
Hide();
}
void RunWork2()
{
// Do a lot of things including update UI
Hide();
}
}
编辑 2
感谢大家的回答和建议。
最后,我采用了将一些小作品分组到我在 UI 中使用的更大作品中的解决方案,而在单元测试中我仍然测试小作品。
实际上这不是我正在寻找的解决方案,我希望找到一个基于处理消息泵或做类似事情的解决方案(参见 System.Windows.Forms.Application 源代码从 RunDialog(.) 和所有被调用的方法我在发布这个问题之前迷路了)。
【问题讨论】:
-
为什么在“完成部分流程后”隐藏进度表?
-
很难在没有任何重现代码的情况下提供帮助。这在很大程度上取决于你真正做事的方式。
-
ShowDialog被阻止。忘记显示对话框。这没有意义。事实上,我无法想象ShowDialog的用途是什么,而您可以禁用表单(或整个表单)的控件并显示一个表单。 -
这是你想做的吗?如果是这样,我将发布为 C# 代码:stackoverflow.com/questions/13206926/…
标签: c# multithreading winforms