Подтвердить что ты не робот

Использование Basic BackgroundWorker с параметрами

Мой метод интенсивного процесса, который я хочу выполнить в фоновом потоке, выглядит следующим образом:

object.Method(paramObj, paramObj2);

Все три из этих объектов - это те, которые я создал. Теперь, из первых примеров, которые я видел, вы можете передать объект в метод DoWork на рабочем столе. Но как мне это сделать, если мне нужно передать дополнительные параметры этому объекту, например, я здесь? Я мог бы обернуть это в один объект и сделать с ним, но я подумал, что было бы разумно получить кого-то другого на этом.

4b9b3361

Ответ 1

Вы можете передать любой объект в аргумент объекта вызова RunWorkerAsync, а затем извлечь аргументы из события DoWork. Вы также можете передавать аргументы из события DoWork в событие RunWorkerCompleted, используя переменную Result в DoWorkEventArgs.

    public Form1()
    {
        InitializeComponent();

        BackgroundWorker worker = new BackgroundWorker();
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
        worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);

        object paramObj = 1;
        object paramObj2 = 2;

        // The parameters you want to pass to the do work event of the background worker.
        object[] parameters = new object [] { paramObj, paramObj2 };

        // This runs the event on new background worker thread.
        worker.RunWorkerAsync(parameters);
    }

    private void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        object[] parameters = e.Argument as object[];

        // do something.

        e.Result = true;
    }

    private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        object result = e.Result;

        // Handle what to do when complete.                        
    }

Ответ 2

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

public class MyWorkerContext
{
   public Object1 Worker;
   public Object2 Parameter1;
   public Object2 Parameter2;
}

то в DoWork вы просто делаете что-то вроде:

MyWorkerContext context = e.Argument as MyWorkerContext;

context.Worker.Method(context.Parameter1, context.Parameter2);

Ответ 3

Вы можете записать их в лямбда для DoWork:

bgw.DoWork += (sender, e) => object.Method(paramObj, paramObj2) ;

e.Argument (то есть значение состояния или объект, переданный в BackgroundWorker.RunWorkerAsync()), может быть 1 из 3, но имеет тип System.Object и потребует бокса. Передача всех параметров непосредственно в лямбда дает вам полную безопасность по всем параметрам без необходимости в боксе или кастинге.

Ответ 4

Вы можете передать объект в метод BackgroundWorker.RunWorkerAsync(). Вы должны перенести ваши два paramObjs в один объект (вы можете использовать массив, кортеж или какой-либо другой составной класс, который вы бы пишете) и передать это как аргумент в RunWorkerAsync().

Затем, когда ваше событие DoWork будет поднято, вы можете получить эти значения, посмотрев на свойство Argument параметра DoWorkEventArgs обработчика событий.

Для получения полного примера, проверьте MSDN: http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker%28v=VS.90%29.aspx