2017-05-30 5 views
-1

La classe A contient deux événements buttonStart_Click, buttonCancel_Click. Lorsque le bouton Démarrer est Cliquez sur BackgroundWorker démarrer le processus.set CancellationPending à false après CancelAsync() demande backgroundworker

Maintenant, lorsque le bouton Annuler a cliqué sur un MessageBox est pop up et si l'utilisateur cliquez sur le bouton Oui BackgroundWorker arrêter le traitement et si l'utilisateur cliquez sur le bouton Aucun BackgroundWorker reprendre le traitement.

Maintenant le problème est après bgw.CancelAsync()CancellationPending devenu vrai maintenant je veux faire CancellationPending à faux après que l'utilisateur a cliqué sur non dans la boîte de message.

quelqu'un peut-il avoir une idée comment puis-je le faire ou une autre solution?

public partial class A : Form 
{ 
    private BackgroundWorker bgw; 

    private void buttonCancel_Click(object sender, EventArgs e) 
    { 
     // Make cancel request 
     if (bgw != null) 
     { 
      bgw.CancelAsync(); 
     } 
    } 

    private void buttonStart_Click(object sender, EventArgs e) 
    { 
    B objB=new B(); 
    bgw = new BackgroundWorker 
      { 
       WorkerReportsProgress = true, 
       WorkerSupportsCancellation = true 
      }; 
    bgw.ProgressChanged += new ProgressChangedEventHandler(BackgroundWorker_ProgressChanged); 
    bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(BackgroundWorker_RunWorkerCompleted); 
    bgw.DoWork += new DoWorkEventHandler(objB.Work);    
    } 
} 

class B 
{ 
     private bool WantToCancle() 
     { 
      DialogResult Result= MessageBox.Show("Are you want to cancel?", "Cancel ?",MessageBoxButtons.YesNo, MessageBoxIcon.Warning); 

      return Result == DialogResult.Yes ? true : false; 
     } 
     public void Work(object sender, DoWorkEventArgs e) 
     { 
      While(condition...) 
      { 
       ...... 
       if(((BackgroundWorker)sender).CancellationPending) 
       { 
        if(WantToCancle()){return;} 
       } 
      } 
    } 
} 
+0

Je ne comprends pas cette question. Pourquoi ne pas simplement mettre l'appel de la méthode 'WantToCancle()' _ [sic] _ dans le gestionnaire d'événement 'Click', _before_ vous appelez' CancelAsync() '? Le fait est, vous devez le faire de cette façon ... vous ne pouvez pas "annuler" un travailleur annulé. Mais pourquoi cela ne vous est-il pas venu à l'esprit? Qu'est-ce qui vous empêche de le faire de cette façon? –

+0

Dans votre boîte de message de suggestion va ouvrir, mais l'arrière-plan est en cours de traitement l'autre code mais je veux arrêter le processus de l'ouvrier de fond, c'est pourquoi il est là @PeterDuniho – QweRty

+0

Je suis en désaccord avec votre objectif de conception. Si l'invite est là pour demander à l'utilisateur s'il veut vraiment annuler l'opération, alors pourquoi interrompre l'opération? Pourquoi ne pas le laisser continuer jusqu'à ce que vous sachiez que l'utilisateur veut l'annuler? Mais peu importe, vous ne pouvez pas annuler le travailleur et ensuite l'annuler. Si vous voulez qu'il s'arrête pendant que vous attendez la saisie de l'utilisateur, vous devez ajouter votre propre mécanisme (comme un sémaphore ou une poignée d'attente). –

Répondre

1

Tout ce que j'ai besoin de faire est d'invoquer.

private bool WantToCancle() 
    { 
     DialogResult Result = DialogResult.Yes; 

     Application.OpenForms["form name"].Invoke((Func<DialogResult>)(() => 
     Result =MessageBox.Show("Are you want to cancel?", "Cancel ?",MessageBoxButtons.YesNo, MessageBoxIcon.Warning); 

     return Result == DialogResult.Yes ? true : false; 
    }