Invio di argomenti al lavoratore in background?

Diciamo che voglio inviare un parametro int a un lavoratore in background, come può essere realizzato?

private void worker_DoWork(object sender, DoWorkEventArgs e) { } 

So quando questo è worker.RunWorkerAsync () ;, Non capisco come definire in worker_DoWork che dovrebbe avere un parametro int.

Lo inizi in questo modo:

 int value = 123; bgw1.RunWorkerAsync(value); // argument: value, the int will be boxed 

e poi

 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. } 

Anche se questa è una domanda già risposta, lascerei un’altra opzione che IMO è molto più facile da leggere:

 BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += (obj, e) => WorkerDoWork(value, text); worker.RunWorkerAsync(); 

E sul metodo del gestore:

 private void WorkerDoWork(int value, string text) { ... } 

Puoi passare più argomenti come questo.

 List arguments = new List(); arguments.Add(argument 1); arguments.Add(argument 1); arguments.Add(argument n); backgroundWorker2.RunWorkerAsync(arguments); private void worker_DoWork(object sender, DoWorkEventArgs e) { List genericlist = e.Argument as List; extract your multiple arguments from this list and cast them and use them. } 

È ansible utilizzare la proprietà DoWorkEventArgs.Argument .

Un esempio completo (anche usando un argomento int) può essere trovato sul sito di Microsoft:

  • Procedura: eseguire un’operazione in background

Controlla la proprietà DoWorkEventArgs.Argument :

 ... 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; } } 

puoi provarlo se vuoi passare più di un tipo di argomenti, prima aggiungili tutti a un array di tipo Object e passa quell’object a RunWorkerAsync () ecco un esempio:

  some_Method(){ List excludeList = new List(); // list of strings string newPath ="some path"; // normal string Object[] args = {newPath,excludeList }; backgroundAnalyzer.RunWorkerAsync(args); } 

Ora nel metodo doWork del lavoratore in background

 backgroundAnalyzer_DoWork(object sender, DoWorkEventArgs e) { backgroundAnalyzer.ReportProgress(50); Object[] arg = e.Argument as Object[]; string path= (string)arg[0]; List lst = (List) arg[1]; ....... // do something...... //..... } 

È necessario il metodo RunWorkerAsync (object) e la proprietà DoWorkEventArgs.Argument .

 worker.RunWorkerAsync(5); private void worker_DoWork(object sender, DoWorkEventArgs e) { int argument = (int)e.Argument; //5 } 

Dovresti sempre provare a utilizzare un object composito con tipi concreti (utilizzando un modello di progettazione composito) piuttosto che un elenco di tipi di object. Chi si ricorderebbe che diamine fosse ciascuno di quegli oggetti? Pensa al mantenimento del tuo codice più tardi … Invece, prova qualcosa del genere:

 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 

E poi:

 Dim person as new MyPerson With { .FirstName = “Joe”, .LastName = "Smith”, ... } backgroundWorker1.RunWorkerAsync(person) 

e poi:

 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; }