Фоновый рабочий делегат и вызывающие - PullRequest
4 голосов
/ 27 октября 2011

У меня есть фоновый работник, который выполняет много GUI-взаимодействий, но моя проблема в том, что все эти объекты находятся в главном потоке (насколько я знаю), и мне нужно все время вызывать, что-то, что делает мой код длиннее и менее читабелен.
1) Знаете ли вы, как я могу создать универсальный метод, который будет вызывать эти элементы GUI.
2) Есть ли более простой способ противостоять этому?

Заранее спасибо.

1 Ответ

3 голосов
/ 27 октября 2011

С помощью BackgroundWorker вы можете ReportProgress и передать процент завершения и объект. Вы можете создать класс, содержащий данные для передачи в пользовательский интерфейс, а затем передать его как объект.

Событие ProgressChanged может манипулировать объектами пользовательского интерфейса, поскольку оно будет выполняться в потоке пользовательского интерфейса.

Пример вашей проблемы

    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 - это тип объекта. вы можете положить в нее все, что захотите, и привести его к нужному типу с другой стороны.

...