2016-11-07 1 views
0

Je veux utiliser cette méthode:Comment puis-je obtenir la valeur de retour lorsque BackgroundWorker est terminé

public static bool SynchronizeFiles(string source, string destination) 

dans BackgroundWorker. Je définis BackgroundWorker et l'ajoute au workerList. Que faire ce travail un par un.

private void CopyIfIsReady(Save save) 
{ 
    if (save.isDriveReady && save.isFileChanged && save.isPeriodCompleted) 
    { 
     BackgroundWorker BW = new BackgroundWorker(); 
     BW.DoWork += (obj, e) => backgroundWorker1_DoWork(save); 
     BW.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted; 
     workerList.Add(BW); 
     BW_timer.Start(500); 
    } 
} 

private void BWTimerCallBack(object state) 
{ 
    if (workerList.Count >= 0) 
    { 
     if(!workerList[0].IsBusy) 
     { 
      workerList[0].RunWorkerAsync(); 
     } 
    } 
    else 
    { 
     BW_timer.Stop(); 
    } 
} 

private void backgroundWorker1_DoWork(Save save) 
{ 
    SynchronizeFiles(save.sourceFolder, save.destFolder); 
} 

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    workerList.RemoveAt(0); 
} 

Mais comment puis-je prendre la valeur de retour de SynchronizeFiles dans backgroundWorker1_RunWorkerCompleted.

+1

Vous devriez utiliser 'Task' et' await' à la place. – SLaks

Répondre

1

Vous n'avez pas vraiment besoin de la méthode backgroundWorker1_DoWork car elle ne fait qu'encapsuler l'appel de méthode SynchronizeFiles. Vous pouvez modifier le gestionnaire d'événements de la manière suivante:

BW.DoWork += (obj, e) => { e.Result = SynchronizeFiles(save.sourceFolder, save.destFolder); } 

maintenant à l'intérieur backgroundWorker1_RunWorkerCompleted vous pouvez accéder au résultat via la propriété e.Result.

+0

Merci. Ça fonctionne bien :) –