首页 >后端开发 >C++ >如何在 WPF 应用程序中执行后台任务而不冻结 UI?

如何在 WPF 应用程序中执行后台任务而不冻结 UI?

Barbara Streisand
Barbara Streisand原创
2025-01-07 14:45:42456浏览

How to Execute Background Tasks in WPF Applications Without Freezing the UI?

在 WPF 应用程序中执行后台任务

在 WPF 应用程序中,通常需要在后台执行任务以避免冻结用户界面 (用户界面)。为此,开发人员需要一种满足以下条件的机制:

  • 非阻塞 UI 线程
  • 进度报告
  • 取消
  • 多线程支持

推荐方法:基于任务API 和 Async/Await

随着 .NET 4.5(或带有 Microsoft.Bcl.Async 库的 .NET 4.0)的发布,后台任务的推荐方法是利用基于任务的 API和异步/等待。该技术具有以下优点:

  • 伪顺序代码工作流程:开发人员可以编写读起来像顺序工作流程的代码,使其更易于理解和维护。
  • 结构化异常处理: Async/await 提供了结构化的方式来处理异步

示例实现

以下代码演示了如何使用基于任务的 API 和 async/await 执行后台任务:

private async void Start(object sender, RoutedEventArgs e)
{
    try
    {
        await Task.Run(() =>
        {
            int progress = 0;
            for (; ; )
            {
                System.Threading.Thread.Sleep(1);
                progress++;
                Logger.Info(progress);
            }
        });
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

此代码与 UI 线程并行生成一个新任务,允许 UI 在后台任务进行时保持响应。它还包括异常处理,以便在任务执行期间发生异常时显示错误消息。

其他资源

有关在带有进度报告的 WPF 中执行后台任务的更多信息和取消支持,请考虑以下参考:

  • [如何在 WPF 后台执行任务,同时能够提供报告并允许取消?](https://stackoverflow.com/questions/12342842/how-to-execute-task-in-the-wpf-background-while-able-to-provide-report-a)
  • [4.5 中的异步:在异步中启用进度和取消API](https://blogs.msdn.microsoft.com/charlie/2012/03/14/async-in-4-5-enabling-progress-and-cancellation-in-async-apis/)
  • [异步和等待](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/)
  • [异步/等待常见问题解答](https://docs.microsoft .com/en-us/dotnet/csharp/programming-guide/concepts/async/async-faq)

以上是如何在 WPF 应用程序中执行后台任务而不冻结 UI?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn