后台工作人员委托&调用器

本文关键字:调用 工作人员 后台 | 更新日期: 2023-09-27 18:12:29

我有一个后台工作器,它做了许多GUI交互,但我的问题是所有这些对象都在主线程中(据我所知),我需要调用所有这些对象,这使得我的代码更长,可读性更差。
你知道我怎样才能创建一个通用方法来调用那些GUI元素吗?
2)有没有更简单的方法来解决这个问题?

后台工作人员委托&调用器

使用BackgroundWorker,您可以报告进度并传递完成百分比和对象。您可以创建一个类来包含要传递给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类型。你可以在里面放任何你想放的东西,然后在另一边把它强制转换成合适的类型。