2008-12-03 6 views
1

Quelque part dans le code, un waitHandle est utilisé pour effectuer certaines actions. Cependant, la chose avec waithandle est que le formulaire se fige en attendant que l'action se termine. Ainsi, le code suivant ne fonctionnerait pas:Comment afficher la barre de progression si waithandle est utilisé

frmProgressBar.show(); 
int successOrFail = PerformSynchronousActionUsingWaitHandle(); 
frmProgressBar.close(); 
frmMainScreen.show(); 

Il ne fonctionnera pas, car le frmProgressBar serait gelé à la place. J'ai vraiment besoin de garder la ligne # 1, la ligne # 3 et la ligne # 4, mais comment réécrire PerformSynchronousActionUsingWaitHandle() de sorte que l'opération soit toujours synchrone mais la barre de progression est affichée. Je pourrais peut-être contourner cela en montrant la barre de progression sur un fil différent, mais la conception du système est telle que ce serait très désordonné. Vous ne pouvez pas utiliser la classe BackgroundWorker?

Répondre

0

Utilisez deux fils différents pour gérer ce ... un fil pour barre de progression et un fil pour PerformSynchronousActionUsingWaitHandle() .. Espérons que cela aide d'une certaine façon

0

Avez-vous essayé d'utiliser la classe à la place BackgroundWorker? Cependant, vous devrez réécrire la méthode en faisant la tâche synchrone.

1

Vous souhaitez exécuter PerformSynchronousActionUsingWaitHandle dans un thread de sorte qu'il ne verrouille pas le thread ui.

public event EventHandler<WorkCompleteArgs> WorkComplete; 
    private void StartClick(object sender, EventArgs e) 
    { 
     //hook a complete event 
     this.WorkComplete += new EventHandler(OnWorkComplete); 

     //do start code 

     //run the PerformSynchronousActionUsingWaitHandle process in a thread 
     Thread thread = new Thread(new ThreadStart(PerformSynchronousActionUsingWaitHandle)); 
     thread.Start(); 
    } 
    private void OnWorkComplete(object sender, EventArgs e) 
    { 
     //cross thread 
     if (this.InvokeRequired) 
     { 
      this.BeginInvoke(new EventHandler(OnWorkComplete), new object[] { sender, e }); 
      return; 
     } 

     //un hook 
     this.WorkComplete -= new EventHandler(OnWorkComplete); 

     //do complete code 

    } 
    private void PerformSynchronousActionUsingWaitHandle() 
    { 
     Thread.Sleep(1000); 
     if (WorkComplete != null) 
     { 
      //use event args to return the functions result if needed. 
      WorkComplete(this, new WorkCompleteArgs(true)); 
     } 
    } 

    public class WorkCompleteArgs 
    { 
     public WorkState {get;private set;} 
     public WorkCompleteArgs(bool workState) 
     { 
      this.WorkState = workState; 
     } 
    } 
+0

Il y a un problème. PerformSynchronousActionUsingWaitHandle() est supposé renvoyer un code d'erreur. Et dans ce cas, StartClick() est censé retourner ce code d'erreur. Ainsi, StartClick() doit attendre que PerformSynchronousActionUsingWaitHandle() se termine avant de retourner. –

+0

@Hao Wooi Lim - vous pouvez personnaliser un argument args pour ramener n'importe quel résultat. J'ai ajouté ceci au code ci-dessus. – Hath

Questions connexes