Comment attendre que BackgroundWorker se termine, puis quittez l'application de la console
J'ai écrit un exemple de l'application de la console pour tester backgroundworker à l'aide de l'un des exemples posté ici en Stackoverflow. J'ai un backgroundworker qui commencent avec la méthode main, mais sa fin au milieu de l'opération si j'appuie sur entrer parce que j'ai écrit une console.readkey dans la méthode main. Mais je veux attendre jusqu'à ce que le composant backgroundworker a fini de faire le travail puis quittez l'application. C'est mon code.
class Program
{
private static BackgroundWorker worker = new BackgroundWorker();
private event EventHandler BackgroundWorkFinished;
static void Main(string[] args)
{
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
worker.ProgressChanged += worker_ProgressChanged;
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;
Console.WriteLine("Starting Application...");
worker.RunWorkerAsync();
Console.ReadKey();
}
static void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
Console.WriteLine(e.ProgressPercentage.ToString());
}
static void worker_DoWork(object sender, DoWorkEventArgs e)
{
Console.WriteLine("Starting to do some work now...");
int i;
for (i = 1; i < 10; i++)
{
Thread.Sleep(1000);
worker.ReportProgress(Convert.ToInt32((100.0 * i) / 10));
}
e.Result = i;
}
static void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Console.WriteLine("Value Of i = " + e.Result.ToString());
Console.WriteLine("Done now...");
}
}
source d'informationauteur Soham Dasgupta
Vous devez vous connecter pour publier un commentaire.
Voir le Comment attendre un BackgroundWorker pour annuler? post pour savoir comment communiquer entre votre BackgroundWorker et votre thread principal.
Fondamentalement, vous devez utiliser un événement que vous définissez lors de la fin de DoWork pour signaler que DoWork est terminé. Ensuite, vous WaitOne() sur cet événement dans votre thread principal.
Le but principal d'un Bgw est d'interagir avec Windows MessageQueue. En d'autres termes, il est plus utile dans les WinForms et WPF applications.
Une application de Console n'est pas le bon endroit pour utiliser ou tester un Bgw. Vous obtiendrez des résultats étranges. Imprimer ManagedThreadId à la clé des points pour voir ce qui se passe.
Et certains conseils: Votre
worker_RunWorkerCompleted()
devriez vérifiere.Error
.maintenant, c'est la même chose que d'avoir un videcatch{}
bloc.Toute erreur de DoWork va maintenant être lancée lorsque vous lisez
e.Result
, plus complexe à gérer.C'est ce que j'ai fait maintenant. Mais le
console.readkey()
ne fonctionne pas. L'application n'est pas en attente pour leReadKey()
fonction.Fixation Edit: Déplacé
resetEvent.Set()
à l'intérieur de DoWork plutôt que dans RunWorkerCompleted. Le Terminé gestionnaire d'événement ne sera jamais appelé parce que le thread principal est en attente de l'événement.