📜  从异步任务报告进度 c# (1)

📅  最后修改于: 2023-12-03 14:49:24.316000             🧑  作者: Mango

从异步任务报告进度

在 C# 中,异步任务是为了避免在执行时间较长的操作时阻塞主线程。但是,当需要在 UI 中显示该操作的进度时,我们可以利用异步任务报告操作进度。

使用 Progress 类

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 事件

我们需要处理 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 线程上报告进度的功能。如果你需要在异步任务中报告进度,那么可以使用这个类来简化你的任务。