2016-10-05 2 views
-2

Ich brauche ein Overlay auf einem WPF Wizardcontrol laden. Ich benutze ein busyIndicator tool von der wpf extendedlit.Benutzerdefinierte Busy-Overlay auf WPF WizardControl mit Async erwarten

Der Code für Async erwartet funktioniert, aber die Gui-Thread-Sperren. Ich versuche, eine Nachricht bitte warten hinzufügen, wenn die warten auf die Funktion

private async void Button1_Click(object sender, RoutedEventArgs e) 
     { 
     BusyIndicator.IsBusy = true; 
     BusyIndicator.IsEnabled = true; 
     BusyIndicator.BusyContent = "Please wait while Site is provisioned"; 

          await Task.Run(() => 
          { 
           LongRunningFunction(); 
          }); 

     BusyIndicator.IsBusy=false; 
     } 

Die XAML für die BusyIndicator nennt als unten.

<xctk:BusyIndicator x:Name="BusyIndicator" IsBusy="False" BusyContent="Please Wait"> 

</xctk:BusyIndicator> 

Die LonRunningFunction ist ein Webservice Aufruf, die nicht die Benutzeroberfläche nur nicht aktualisiert liefert einen Bool Wert

public static bool LongRunningFunction(string URL) 
     { 

      bool IsPresent = CallWebservice() 
      return IsPresent; 
     } 

Ausgabe

1) Die BusyIndicator scheint nicht statt, bevor der Asynchron-Aufruf zu feuern es scheint Feuer zu sein, wenn die LongRunning-Aufgabe abgeschlossen ist

2) Was ist der richtige Prozess, um ein GUI-Overlay aufzurufen, wenn async und warten verwendet wird.

+0

Haben Sie versucht, 'ThreadPool' zu verwenden anstatt zu warten? Das Problem ist dann, dass, wenn Sie irgendwelche UI-Elemente in dieser longRunningTask manipulieren, Sie Dispatcher verwenden müssen, [Here] (http://stackoverflow.com/a/37483878/2029607) ist, wie Sie es in Ihrem Code verwenden können. – XAMlMAX

+0

@XAMlMAX Er * verwendet * den Thread-Pool. 'Task.Run' plant die Arbeit in einem Thread-Pool-Thread. – Servy

+0

Ohne 'LongRunningFunction' zu sehen, gibt es keine Möglichkeit zu wissen, warum der Code nicht funktioniert. Offensichtlich tut es * etwas * sollte es nicht, aber wir wissen nicht was. – Servy

Antwort

0

So habe ich das Problem mit asynchronen Anrufen gelöst.
Kontext:
Hier bin MvvM bin mit Ihnen gute Praxis zu zeigen, wenn sie mit WPF

using System.Threading; 
using System.Threading.Tasks; 
using System.Windows.Data; 
using System.Windows.Input; 
using System.Windows.Threading; 
class VM 
    { 
     Dispatcher _dispatcher = Dispatcher.CurrentDispatcher; 
     //Time consuming operation 
     private void LongTask() 
     { 
      Thread.Sleep(5000); 
      //in here if you need to send something to the UI thread like an event use it like so: 
      _dispatcher.Invoke(new Action(() => 
      { 
       //some code here to invoke an event 
       if (ComponentsLoaded != null) 
        ComponentsLoaded(this, new EventArgs { }); 
      })); 
     } 

     private ICommand _command; 
     //This is the command to be used instead of click event handler 
     public ICommand Command 
     { 
      get { return _command; } 
      private set { _command = value; } 
     } 
     //method associated with ICommand 
     void commandMethod(object parameter) 
     { 
      Busy = true; 
      ThreadPool.QueueUserWorkItem(new WaitCallback(multiThreadTask)); 
      Busy = false; 
     } 
     //the task to be started on another thread 
     void multiThreadTask(object parameter) 
     { 
      LongTask(); 
     } 

     public event EventHandler ComponentsLoaded; 
    } 

Dies ist, was ich bei der Arbeit mit mehreren Threads in WPF arbeiten.
Sie können dies immer noch in den Code-Behind verwenden nur instanziieren Sie die Dispatcher und Sie sind gut zu gehen.
Wenn Sie weitere Informationen benötigen, lassen Sie es uns wissen. HTH