【问题标题】:background worker delegate & invokers后台工作代表和调用者
【发布时间】:2011-10-27 14:04:54
【问题描述】:

我有一个执行许多 GUI 交互的后台工作程序,但我的问题是所有这些对象都在主线程中(据我所知),我需要一直调用所有这些对象我的代码更长,可读性更差。
1) 你知道如何创建一个通用方法来调用这些 GUI 元素。
2)有没有更简单的方法来面对这个?

提前致谢。

【问题讨论】:

  • 那只是做错了,你不应该在 BGW 线程中使用 Begin/Invoke。 ProgressChanged 和 RunWorkerCompleted 事件旨在执行此操作。只专注于在worker中生成数据。并在事件处理程序中使用该数据更新 UI。
  • @HansPassant,我如何传递数据?

标签: c# delegates backgroundworker invoke


【解决方案1】:

使用 BackgroundWorker,您可以ReportProgress 并传递完成百分比和对象。您可以创建一个类来包含要传递给 UI 的数据,然后将其作为对象传递。

ProgressChanged 事件可以操作 UI 对象,因为它会在 UI 线程中运行。

您的问题示例

    private void Form1_Load(object sender, EventArgs e)
    {
        backgroundWorker1.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        List<string> items = new List<string>();

        items.Add("Starting");
        System.Threading.Thread.Sleep(2500);
        backgroundWorker1.ReportProgress(25, items.ToArray());

        items.Add("Halfway there");
        System.Threading.Thread.Sleep(2500);
        backgroundWorker1.ReportProgress(50, items.ToArray());

        items.Add("Almost there");
        System.Threading.Thread.Sleep(2500);
        backgroundWorker1.ReportProgress(75, items.ToArray());

        items.Add("Done");
        System.Threading.Thread.Sleep(2500);
        backgroundWorker1.ReportProgress(100, items.ToArray());
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        listBox1.Items.Clear();
        listBox1.Items.AddRange((string [])e.UserState);
        this.Text = e.ProgressPercentage.ToString();
    }

ReportProgress 中的第二个参数是 Object 类型。您可以将任何您想要的内容放入其中并将其转换为另一侧的正确类型。

【讨论】:

  • 感谢您的示例,但我需要将生成的数据发送到 ProgressChanged,我现在有一个包含数据的数组,但我不知道如何将它传递给那里+我不知道不想改变进度百分比。
  • 将数组作为 ReportProgress 中的第二个参数传递。这映射到 ProgressChanged 事件中的 UserState。将 UserState 投射到您的数组中。
  • 更新以演示如何通过 UserState 变量传递数组。
猜你喜欢
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
相关资源
最近更新 更多