背景工作者代表&调用者

时间:2011-10-27 14:04:54

标签: c# delegates backgroundworker invoke

我有一个后台工作程序,可以进行许多GUI交互,但我的问题是所有这些对象都在主线程中(据我所知),我需要一直调用所有这些,正在制作的东西我的代码更长,更不易阅读 1)您知道如何创建一个调用这些GUI元素的通用方法 2)有没有更简单的方法来对付这个?

提前致谢。

1 个答案:

答案 0 :(得分:3)

使用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类型。你可以把任何你想要的东西放在另一边,并把它扔到正确的类型。