📅  最后修改于: 2023-12-03 14:49:24.316000             🧑  作者: Mango
在 C# 中,异步任务是为了避免在执行时间较长的操作时阻塞主线程。但是,当需要在 UI 中显示该操作的进度时,我们可以利用异步任务报告操作进度。
Progress
类是在异步操作进行时报告进度信息的一种方便方式。它封装了一些用于在 UI 线程上报告进度的功能,可以作为泛型参数传递到异步任务中。以下是一个示例:
public async Task<int> LongOperation(IProgress<int> progress)
{
int total = 10000;
int result = 0;
for (int i = 0; i < total; i++)
{
// Compute some result.
result += i;
// Report progress.
if (progress != null)
progress.Report((i * 100) / total);
// Check if the operation is cancelled.
if (cancellationToken.IsCancellationRequested)
return -1;
}
return result;
}
在上面的示例中,我们传递了一个类型为 IProgress<int>
的进度报告器。在循环中,我们进行了一些计算,并在每个迭代结束时报告计算进度。
我们需要处理 ProgressChanged
事件来在 UI 中显示进度信息。通常,我们可以创建一个方法来处理此事件。下面是一个完整的例子:
async void StartButton_Click(object sender, RoutedEventArgs e)
{
// Create a new progress reporter.
Progress<int> progress = new Progress<int>();
// Set up the progress reporter to update the UI.
progress.ProgressChanged += (s, progressValue) =>
{
progressBar.Value = progressValue;
};
// Start the long-running operation.
int result = await LongOperation(progress);
// Report the final result.
MessageBox.Show(result.ToString());
}
在上面的示例中,我们创建了一个 Progress<int>
类型的进度报告器,并将其传递给了 LongOperation
方法。我们还设置了一个事件处理程序,在 ProgressChanged
事件上更新 UI。
使用 Progress
类可以轻松实现在异步任务中报告进度。它封装了许多用于在 UI 线程上报告进度的功能。如果你需要在异步任务中报告进度,那么可以使用这个类来简化你的任务。