【问题标题】:Trying to add a please wait popup when executing a long process, pop up shows, but process never runs尝试在执行长进程时添加请等待弹出窗口,弹出显示,但进程从不运行
【发布时间】: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


【解决方案1】:

所以我对我的代码进行了一些更改,我将所有数据源绑定从我的 ParseFilteredData 方法移到了它自己的方法中,所以 ParseFilteredData 现在只是构建数据表,这是耗时的部分。然后在 Using 语句之后,我调用我的新方法,所有内容都会填充并显示

    private void btnFilters_Click(object sender, EventArgs e)
    {
        using (Processing pc = new Processing(ParseFilteredData))
        {
            pc.ShowDialog(this);
        }
        BindAllListBoxes();
    }

我还将数据表移到方法之外,只是填充它们,而不是同时初始化和填充。这允许在该方法之外访问数据表。

因此,为了让我的代码按我的意愿工作,我必须拆分我的 ParseFilteredData 方法。它现在似乎像一个魅力..

感谢弗兰克的建议。

【讨论】:

  • 如果您正在构建/填充多个数据表,将负载分散到多个线程之间可能是值得的。带上你的重击手,让他们分开跑。多线程这种进程可以节省很多时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 2020-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多