【发布时间】:2020-04-06 19:43:04
【问题描述】:
所以我有一个进程可以运行一些较大的文件,并希望添加一个“请稍候......处理......弹出窗口,以便知道它正在处理他们的任务。
我在 youtube 上关注了这个视频示例 C# Wait Form Tutuorial
像示例一样实现,但实际完成工作的方法永远不会运行
这是我的处理表单逻辑,当我运行整个应用程序时会显示
public partial class Processing : Form
{
public Action Worker { get; set; }
public Processing(Action worker)
{
InitializeComponent();
if(worker==null)
throw new ArgumentNullException();
Worker = worker;
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
Task.Factory.StartNew(Worker).ContinueWith(t => { this.Close(); }, TaskScheduler.FromCurrentSynchronizationContext());
}
}
这就是我从按钮单击中调用它的方式
private void btnFilters_Click(object sender, EventArgs e)
{
using (Processing pc = new Processing(ParseFilteredData))
{
pc.ShowDialog(this);
}
//ParseFilteredData();
}
为什么我的 ParseFilteredData 正在执行但没有更新我的主窗体?我单步执行代码并执行该方法,但我的 UI 没有反映数据。
请记住,我的 ParseFilteredData 有效,如果您注释掉 using 语句并在单击按钮时运行该方法,几分钟后,我的所有列表框都会被填充。
【问题讨论】:
-
将 ParseFilteredData 放入 FormLoad 事件中。
-
@Frank Ball 你是什么意思?主窗口的表单加载事件?还是处理窗口?
-
把它放在“处理”表单的 FormLoad 事件中。如果这是调用此函数的唯一位置,则将整个函数放入 FormLoad 事件中,如果不是,则为其创建一个简单的类。如果需要,您可以在表单的构造函数中简单地传递任何需要的参数。
-
相关:Async ShowDialog。您可以从
Processing表单中删除所有代码,只需在btnFilters_Click处理程序中使用Noseratio 的ShowDialogAsync方法(在将async关键字添加到处理程序之后)。这样一来,一切都将集中在一个地方。
标签: c# multithreading task