2016-07-09 8 views
2

Ich möchte den Fortschritt anzeigen Dialog innerhalb einer asynchronen Ereignis-Listener-Methode. Derzeit ist der UI-Component nur sichtbar, wenn die asynchrone Methode fertig ausgeführt wurde. Hier ist mein Code:zeigt den Fortschritt Dialog innerhalb einer asynchronen Methode

async void process_Click(object sender, EventArgs e) 
    { 

     launchRingProgressDialog(); 

     var comp = await Start(); 

    } 

public void launchRingProgressDialog() 
    { 
     Activity.RunOnUiThread(() => 
     { 
      ProgressDialog ringProgressDialog = ProgressDialog.Show(Activity, "Processing", "Please wait", true); 
      ringProgressDialog.SetCancelable(true); 
     }); 
    } 

Der Fortschrittsdialog zeigt an, wenn ich die Methode launchRingProgressDialog() außerhalb der Asynchron-Methode aufrufen, aber nicht während der Asynchron-Methode ausgeführt wird. Wie mache ich die asynchrone Methode, damit die UI-Komponente nicht blockiert wird?

bearbeiten

Wie ich verstehe, läuft die Asynchron-Methode innerhalb des UI-Thread so ist RunOnUiThread nicht benötigt. Ich habe meinen Code wie folgt geändert, aber ich stehe immer noch vor demselben Problem.

async void process_Click(object sender, EventArgs e) 
    { 

     ringProgressDialog = ProgressDialog.Show(Activity, "Processing", "Please wait", true); 

     var comp = await Start(); 

     ringProgressDialog.Dismiss(); 

     } 

Antwort

0

Wenn UI-Code in einer async Methode ausgeführt wird, die von dem UI-Thread (zB UI Ereignisse wie Mausklicks wie die, die Sie haben in Ihrem Code) aufgerufen wird, müssen Sie nicht RunOnUiThread verwenden. Dies ist der Fall, wenn eine await ed Task abgeschlossen ist, fährt die Methode mit dem aufrufenden Thread fort, der in diesem Fall der UI-Thread ist.

Zum Beispiel sehen Sie den folgenden Code, der Teil eines meiner Apps ist, die erfolgreich mit den gewünschten Ergebnissen führt:

private async void ExecuteSearchButton_Click(object sender, System.EventArgs e) 
{ 
    spinner.Visibility = ViewStates.Visible; 

    CollectionFeed feed = await CollectionFeed.SearchAsync(searchEditText.Text); 

    GenericAdapter<Collection, CollectionViewHolder> adapter = 
      new GenericAdapter<Collection, CollectionViewHolder>(Resource.Layout.CollectionRecyclerViewItem, 
                   feed.Results, view => new CollectionViewHolder(view)); 

    searchResultRecyclerView.SetAdapter(adapter); 

    spinner.Visibility = ViewStates.Gone; 
} 

Die spinner auf Klick erscheint und verschwindet, wenn die Daten in den RecyclerView.Adapter geladen wird (die auch erfolgreich geladen wird).

bearbeiteten Methode

public void launchRingProgressDialog() 
{ 
    ProgressDialog ringProgressDialog = ProgressDialog.Show(Activity, "Processing", "Please wait", true, true); 
} 

sein Es nutzt this ProgressDialog constructor den SetCancelable Aufruf zu entfernen.

+0

Ich verstehe, dass die Async-Methode im UI-Thread ausgeführt wird und ich RunOnUiThread nicht benötigen. Ich starte den Dialog, bevor die asynchrone Operation ausgeführt wird, und lehne sie ab, nachdem ich gewartet habe, aber das funktioniert nicht wirklich. Der Dialog oder eine andere UI-Komponente wird erst sichtbar, nachdem die gesamte asynchrone Methode ausgeführt wurde. Vielleicht sollte ich einen neuen Thread in der asynchronen Methode starten und die asynchrone Operation darin ausführen? –

+0

@AhmedMujtaba Wenn ich meinen Code ändere, den ich als Beispiel für einen 'ProgressDialog' angegeben habe, erscheint er und wird zur richtigen Zeit geschlossen. Ist Ihre Async-Operation von kurzer Dauer (<1 Sekunde)? Wenn dies der Fall ist, könnte dies der Grund sein, dass, wenn eine Async-Methode zum ersten Mal nach dem Start der Anwendung aufgerufen wird, Xamarin eine kleine Pause in der Anwendung verursacht. – EvilTak

+0

Ich habe es gelöst, indem ich die asynchrone Operation in Task.Run ausgeführt habe. Ich habe ein kleines Problem, das noch gelöst werden muss. Ich wollte ein neues ProgressDiaglog starten, nachdem das erste ProgressDiaglog beendet wurde, aber das zweite Dialogfeld wird erst angezeigt, wenn die Async-Methode beendet ist. Liegt das daran, dass auf dem UIhread zu viel Aktivität stattfindet und andere UI-Vorgänge blockiert werden? –

Verwandte Themen