Der async
Muster unterstützt Fortschrittsaktualisierungen.
Kurz gesagt, Ihre async
Methode kann einen IProgress<T>
annehmen , und Ihr aufrufender Code übergibt eine Implementierung dieser Schnittstelle (normalerweise Progress<T>
).
public class ProcessWithUpdates
{
public async Task Run(IProgress<string> progress)
{
await Task.Run(() =>
{
for (int i = 0; i < 10; i++)
{
if (progress != null)
progress.Report(String.Format("Update {0}", i));
Thread.Sleep(500);
}
});
}
}
// calling code
ProcessWithUpdates pwp = new ProcessWithUpdates();
await pwp.Run(new Progress<string>(pwp_StatusUpdate));
Sie sollten Invoke
verwenden Methode von Control
. Es führt Code im Thread von Control aus. Sie können auch InvokeRequired
überprüfen -Eigenschaft, um zu prüfen, ob Sie Invoke
aufrufen müssen -Methode (es prüft, ob sich der Aufrufer in einem anderen Thread befindet als dem, in dem das Steuerelement erstellt wurde).
Einfaches Beispiel:
void SomeAsyncMethod()
{
// Do some work
if (this.InvokeRequired)
{
this.Invoke((MethodInvoker)(() =>
{
DoUpdateUI();
}
));
}
else
{
DoUpdateUI();
}
}
void DoUpdateUI()
{
// Your UI update code here
}
In einigen Fällen sollten Sie den IsHandleCreated
überprüfen Eigentum von Control
bevor Sie Invoke
aufrufen Methode. Wenn IsHandleCreated
gibt false zurück, dann müssen Sie warten, während das Handle von Control erstellt wird