Использование Basic BackgroundWorker с параметрами
Мой метод интенсивного процесса, который я хочу выполнить в фоновом потоке, выглядит следующим образом:
object.Method(paramObj, paramObj2);
Все три из этих объектов - это те, которые я создал. Теперь, из первых примеров, которые я видел, вы можете передать объект в метод DoWork на рабочем столе. Но как мне это сделать, если мне нужно передать дополнительные параметры этому объекту, например, я здесь? Я мог бы обернуть это в один объект и сделать с ним, но я подумал, что было бы разумно получить кого-то другого на этом.
Ответы
Ответ 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