Ich versuche eine async await
zu verwenden, um eine Fortschrittsanzeige auf meinem WinForm basierend auf einem Kopiervorgang zu aktualisieren, aber der Fortschrittsbalken wird nur aktualisiert, wenn die Copy
Funktion beendet ist, und löst dann eine Ausnahme aus nicht aktualisieren, da es nicht im selben Thread ist?Async Progress Bar Update
Die Kopierfunktion muss nicht mit der Benutzeroberfläche interagieren, die Progress-Funktion jedoch.
Die Benutzeroberfläche ist jedoch nicht blockiert, daher scheint der asynchrone Teil wie erwartet zu funktionieren, er interagiert nur mit dem UI-Thread, der nicht funktioniert.
long fileProgress = 0;
long totalProgress = 0;
bool complete = false;
CopyFileEx.CopyFileCallbackAction callback(FileInfo source, FileInfo destination, object state, long totalFileSize, long totalBytesTransferred)
{
fileProgress = totalBytesTransferred;
totalProgress = totalFileSize;
return CopyFileEx.CopyFileCallbackAction.Continue;
}
async Task Progress()
{
await Task.Run(() =>
{
while (!complete)
{
if (fileProgress != 0 && totalProgress != 0)
{
fileProgressBar.Value = (int)(fileProgress/totalProgress) * 100;
}
}
});
}
private async void startButton_Click(object sender, EventArgs e)
{
Copy();
await Progress();
MessageBox.Show("Done");
}
void Copy()
{
Task.Run(() =>
{
CopyFileEx.FileRoutines.CopyFile(new FileInfo(@"C:\_USB\Fear.rar"), new FileInfo(@"H:\Fear.rar"), CopyFileEx.CopyFileOptions.All, callback, null);
complete = true;
});
}
Danke, das hat gut funktioniert. –
Mit dem Hinweis 'fileProgressBar.Invoke (() => {...});' wird nicht kompiliert, Sie müssen einen Delegattyp verwenden wie: 'fileProgressBar.Invoke (new Action (() => {. ..})); ' – Softerware