Отправка Аргументов Фоновому Работнику?
допустим, я хочу отправить параметр int фоновому работнику, как это можно сделать?
private void worker_DoWork(object sender, DoWorkEventArgs e) {
}
Я знаю, когда это работник.RunWorkerAsync ();, я не понимаю, как определить в worker_DoWork, что он должен принимать параметр int.
8 ответов:
вы начинаете это так:
int value = 123; bgw1.RunWorkerAsync(argument: value); // the int will be boxed
а то
private void worker_DoWork(object sender, DoWorkEventArgs e) { int value = (int) e.Argument; // the 'argument' parameter resurfaces here ... // and to transport a result back to the main thread double result = 0.1 * value; e.Result = result; } // the Completed handler should follow this pattern // for Error and (optionally) Cancellation handling private void worker_Completed(object sender, RunWorkerCompletedEventArgs e) { // check error, check cancel, then use result if (e.Error != null) { // handle the error } else if (e.Cancelled) { // handle cancellation } else { double result = (double) e.Result; // use it on the UI thread } // general cleanup code, runs when there was an error or not. }
несмотря на то, что это уже ответ на вопрос, я бы оставил другой вариант, который IMO намного легче читать:
BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += (obj, e) => WorkerDoWork(value, text); worker.RunWorkerAsync();
и на метод обработчика:
private void WorkerDoWork(int value, string text) { ... }
вы можете передать несколько аргументов, как это.
List<object> arguments = new List<object>(); arguments.Add(argument 1); arguments.Add(argument 1); arguments.Add(argument n); backgroundWorker2.RunWorkerAsync(arguments); private void worker_DoWork(object sender, DoWorkEventArgs e) { List<object> genericlist = e.Argument as List<object>; extract your multiple arguments from this list and cast them and use them. }
можно использовать
DoWorkEventArgs.Argument
собственность.полный пример (даже с использованием аргумента int) можно найти на сайте Microsoft:
Проверьте DoWorkEventArgs.Свойство Аргумента:
... backgroundWorker1.RunWorkerAsync(yourInt); ... private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { // Do not access the form's BackgroundWorker reference directly. // Instead, use the reference provided by the sender parameter. BackgroundWorker bw = sender as BackgroundWorker; // Extract the argument. int arg = (int)e.Argument; // Start the time-consuming operation. e.Result = TimeConsumingOperation(bw, arg); // If the operation was canceled by the user, // set the DoWorkEventArgs.Cancel property to true. if (bw.CancellationPending) { e.Cancel = true; } }
вы можете попробовать это, если вы хотите передать более одного типа аргументов, сначала добавьте их все в массив типа Object и передать этот объект в RunWorkerAsync() вот пример :
some_Method(){ List<string> excludeList = new List<string>(); // list of strings string newPath ="some path"; // normal string Object[] args = {newPath,excludeList }; backgroundAnalyzer.RunWorkerAsync(args); }
теперь в методе doWork фонового рабочего
backgroundAnalyzer_DoWork(object sender, DoWorkEventArgs e) { backgroundAnalyzer.ReportProgress(50); Object[] arg = e.Argument as Object[]; string path= (string)arg[0]; List<string> lst = (List<string>) arg[1]; ....... // do something...... //..... }
вам нужно RunWorkerAsync (object) способ и DoWorkEventArgs.Аргумент собственность.
worker.RunWorkerAsync(5); private void worker_DoWork(object sender, DoWorkEventArgs e) { int argument = (int)e.Argument; //5 }
вы всегда должны пытаться использовать составной объект с конкретными типами (используя составной шаблон проектирования), а не список типов объектов. Кто бы мог вспомнить, что за чертовщина каждый из этих объектов? Подумайте о поддержании вашего кода позже... Вместо этого попробуйте что-то вроде этого:
Public (Class or Structure) MyPerson public string FirstName { get; set; } public string LastName { get; set; } public string Address { get; set; } public int ZipCode { get; set; } End Class
и затем:
Dim person as new MyPerson With { .FirstName = “Joe”, .LastName = "Smith”, ... } backgroundWorker1.RunWorkerAsync(person)
и затем:
private void backgroundWorker1_DoWork (object sender, DoWorkEventArgs e) { MyPerson person = e.Argument as MyPerson string firstname = person.FirstName; string lastname = person.LastName; int zipcode = person.ZipCode; }