2017-03-06 1 views
0

Pour de nombreuses raisons, je ne peux pas exécuter la partie principale du code dans un arrière-plan, mais je peux ouvrir une boîte de dialogue Chargement en arrière-plan, mais fermer la boîte de dialogue. J'ai implimented ce qui suit, mais je ne suis pas sûr de savoir comment fermer avec force le travailleur de fond après l'exécution de code:Chargement de la boîte de dialogue dans BackgroundWorker

LoaderWorker = new BackgroundWorker(); 

    //Loading is the Form 
    Loading Loader = new Loading("Daten Exportieren"); 

    LoaderWorker.DoWork += (s, args) => 
    { 
    //Show Loading Dialog 
    Loader.Show(); 
    }; 

    ExecuteMainTasks(); 

    //Here i need to stop the backgroundworker after the method above is complete. 

Y at-il une solution à ce avec un travailleur de fond ou devrais-je utiliser une approche différente pour assurer i ne verrouillez pas le fil d'interface utilisateur pour le chargeur. Rappelez-vous ... je ne peux pas exécuter le code principal dans le backgroundworker donc je dois gérer cela un peu en arrière.

Merci.

Répondre

0
Control.Invoke 
Control.BeginInvoke 

(Windows Forms)

ou

Disopatcher.Invoke 
Dispatcher.BeginInvoke 

(WPF)

ou

CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync 

(WinRT)

L'appel à partir de l'agent d'arrière-plan exécutera le lambda/délégué transmis dans le thread d'interface utilisateur. Effectuez simplement des notifications de progression/finies de cette manière à partir de votre assistant d'arrière-plan. Par conséquent, affichez votre boîte de dialogue dans le thread d'interface utilisateur, puis démarrez le worker d'arrière-plan à partir duquel vous pouvez utiliser cette méthode d'exécution de code dans le thread d'interface utilisateur. Assurez-vous que vous arrêtez de façon synchrone le travailleur d'arrière-plan lorsque l'utilisateur ferme/ferme la boîte de dialogue.

+0

Merci Yeoman mais j'utilise C# 6 et je ne trouve aucune référence à Dispatcher.BeginInvoke ou aux assemblages associés. Avez-vous par hasard un exemple rapide de la façon dont cela est implanté? Je cherche juste à exécuter un gif animé sous une forme dans un worker d'arrière-plan puis à exécuter une opération complexe sur l'arrière-plan et à fermer l'arrière-plan par la suite ... très en arrière, mais je dois le faire de cette façon. –

+0

Quelle structure d'interface utilisateur utilisez-vous? Windows Forms, WPF ou WinRT? – yeoman

+0

Je pense que WinRT est maintenant appelé Universal Windows Apps, btw. – yeoman