c# - 如何使用 WPF 后台 worker

标签 c# wpf multithreading backgroundworker

在我的应用程序中,我需要执行一系列初始化步骤,这些步骤需要 7-8 秒才能完成,在此期间我的 UI 变得无响应。为了解决这个问题,我在一个单独的线程中执行初始化:

public void Initialization()
{
    Thread initThread = new Thread(new ThreadStart(InitializationThread));
    initThread.Start();
}

public void InitializationThread()
{
    outputMessage("Initializing...");
    //DO INITIALIZATION
    outputMessage("Initialization Complete");
}

我已经阅读了一些关于 BackgroundWorker 的文章,以及它如何让我的应用程序保持响应,而无需编写线程来执行冗长的任务,但我没有成功尝试要实现它,谁能告诉我如何使用 BackgroundWorker 来实现它?

最佳答案

  1. 添加使用

    using System.ComponentModel;
    
  2. 声明Background Worker :

    private readonly BackgroundWorker worker = new BackgroundWorker();
    
  3. 订阅事件:

    worker.DoWork += worker_DoWork;
    worker.RunWorkerCompleted += worker_RunWorkerCompleted;
    
  4. 实现两种方法:

    private void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        // run all background tasks here
    }
    
    private void worker_RunWorkerCompleted(object sender, 
                                               RunWorkerCompletedEventArgs e)
    {
        //update ui once worker complete his work
    }
    
  5. 在需要时运行 worker async。

    worker.RunWorkerAsync();
    
  6. 跟踪进度(可选,但通常很有用)

    a) 订阅ProgressChanged事件并在DoWork中使用ReportProgress(Int32)

    b) 设置 worker.WorkerReportsProgress = true;(感谢@zagy)

关于c# - 如何使用 WPF 后台 worker ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5483565/

相关文章:

java - 如何在ANDROID中的以下条件下停止正在运行的线程

c# - Log Entity Framework .Net Core 2.2 EF 调试输出窗口

c# - 凸包中的最远点

c# - 在 WPF DataGrid 中禁用选择

c++ - SWIG C++ Python 多态和多线程

c# - MsgWaitForMultipleObjects 的 C# 等价物是什么?

c# - 选择 Cast (Scope_identity) 并执行标量

c# - 限制 .DLL 访问

c# - WPF 针对 .NET 4.5 但 Windows 要求在应用程序运行时安装 .NET 3.5

wpf - 滚动和拉伸(stretch)扩展器的内容