2012-12-20 2 views
2

J'ai regardé msdn et des questions similaires d'échange de pile pour savoir comment utiliser les travailleurs de fond. Fondamentalement, ma fonction upload-programme fait le travail actuel, mais je veux un thread pour changer les éléments de l'interface utilisateur comme il va (barres de progression, etc) et que j'évalue les événements à modifier. Ce que j'ai essayé est ci-dessous (durement édité), cela ne fonctionne pas et le programme semble couper après l'appel à runworkerasync. Y a-t-il quelque chose de faux ou est-ce que j'ai eu tort d'envoyer ma commande "à l'autre thread"?Un autre travailleur de fond

BackgroundWorker backgroundUpload = new System.ComponentModel.BackgroundWorker(); 

Le premier bit est l'appel:

 if (backgroundUpload.IsBusy != true) 
     { 
      backgroundUpload.RunWorkerAsync(work); 
       // a command here for debug purposes (eg a message box) will run 
     } 
     else 
     { //it doesn't go here, this isn't the error} 

Alors le DoWork, il ne semble jamais arriver.

private void backgroundUpload_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker worker = sender as BackgroundWorker; 
     e.Result = UploadProgram((Workload)e.Argument, worker, e); //workload is one of my enums 
    } 

ne semble jamais arriver non plus.

bool UploadProgram(Workload work, BackgroundWorker worker, DoWorkEventArgs e) 
    { 
    } 

    //also there is progress changed and run worker complete. 
+1

Je suppose que vous faites, mais vous avez une décélération du DoWork délégué de l'événement? C'est à dire. backgroundUpload.DoWork + = nouveau DoWorkEventHandler (UploadProgram); –

+0

Eh bien c'était simple. Bien joué tout le monde, j'ai des sentiments mitigés. –

Répondre

2

Dans votre code manque la plomberie nécessaire pour laisser un BackgroundWorker communiquer avec l'interface utilisateur

vous devez être sûr que ces propriétés et les événements sont correctement réglés

..... 
backgroundUpload.DoWork += backgroundUpload_DoWork 
backgroundUpload.ProgressChanged += backgroundUpload_ProgressChanged; 
backgroundUpload.WorkerReportsProgress = true; 
..... 

vous avez besoin d'un gestionnaire d'événements en cours d'exécution sur le thread UI qui met à jour votre barre de progression

private void backgroundUpload_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    progressBar.Value = (e.ProgressPercentage.ToString() + "%"); 
} 

et pendant que vous travaillez pour télécharger le fichier un appel à

worker.ReportProgress(percentComplete); 
4

Souscrivez-vous votre gestionnaire d'événements à l'événement?

BackgroundWorker backgroundUpload = new System.ComponentModel.BackgroundWorker(); 
backgroundUpload.DoWork += backgroundUpload_DoWork; 
Questions connexes