C# Async Task-Wechsel Label Text
Den folgenden Code nicht ändern Sie den Text und Stoppt die Ausführung der Task
private void button1_Click(object sender, EventArgs e)
{
label1.Text = "Test";
Task.Run(() => MyAsyncMethod());
}
public async Task MyAsyncMethod()
{
label1.Text = "";
//everything from here on will not be executed
}
wäre wirklich praktisch, wenn Sie verwenden könnte, async zusammen mit den UI -
- können Sie versuchen, Fragen für "label1.InvokeRequired" und buchstäblich Berufen, wenn erforderlich, die asynchron Aufgabe?
- okay InvokeRequired true zurückgibt.
- Sie versuchen zu ändern, ein UI-Steuerelement aus einem thread, dass ist nicht der UI-thread. versuchen
label1.Text = "test";
await MyAsyncMethod();
label1.Text="";
Du musst angemeldet sein, um einen Kommentar abzugeben.
für den Zugriff auf eine GUI-Steuerung durch einen zweiten Faden, den Sie machen zu müssen.
folgende Beispiel zeigt, wie ein label-text richtig
Ich hoffe das löst dein problem
Design
async
wurde sorgfältig durchgeführt, so dass Sie kann verwenden Sie es, natürlich mit der Benutzeroberfläche.Wenn Sie asynchrone I/O-Methoden (die Sie sollten), dann können Sie genau dies tun:
Dass die meisten natürlichen Ansatz.
Jedoch, wenn Sie müssen zum ausführen von code auf einem hintergrund-thread (z.B., es ist eigentlich die CPU-gebunden ist, oder wenn Sie wollen einfach nicht, um Ihre I/O-Operationen asynchron, wie Sie sein sollte), dann können Sie
IProgress<T>
:Unter keinen Umständen sollten moderne-code verwenden
Control.Invoke
oder (noch schlimmer)Control.InvokeRequired
.System.InvalidOperationException: 'Cross-thread operation not valid: Control 'labelProject' accessed from a thread other than the thread it was created on.'
ConfigureAwait
mit derawait
nennen. Der gleiche Fall ist hier beschrieben stackoverflow.com/questions/37898516/...ConfigureAwait(false)
.Task.Run
verwendet wird, um den Umschlag einer Aktion (das ist nicht async) in einer Aufgabe. Jede Aufgabe, die Sie ausführen möchten, sollten abgewartet werden. So, dassTask.Run
von Ihnen ist, konsequent nichts zu tun.Mark, die
button1_Click
event-handler von dir als async. Entfernen Sie dieTask.Run
und stattdessen erwartenMyAsyncMethod()
.Versuchen. Sie brauchen nicht, um das Feuer einen neuen thread zum aufrufen der async-Methode. der compiler wird es für Sie tun.
Ich denke, dass beide die Fragen und einige der Antworten sind nicht klar. Je nachdem, wo in der task-thread, die Sie brauchen, zu aktualisieren, die Marke, die Sie haben, zu verwenden, aufzurufen. Ansonsten können Sie einen nutzen erwarten, und nutzen Sie die standard-Semantik.