提问者:小点点

C#backgroundworker问题


我对C#中的backgroundworker有一个问题。我正在编码一个dll文件。

这是我在VS2019中的类库(.NET Framework)类型项目中的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace States
{    
    public class ST
    {        
        public static void Read()
        {
            BackgroundWorker bgwMessage = new BackgroundWorker();
            bgwMessage.DoWork += new DoWorkEventHandler(BgwFileOpen_DoWork);
            bgwMessage.RunWorkerAsync();
        }
       
        private static void BgwFileOpen_DoWork(object sender, DoWorkEventArgs e)
        {
            MessageBox.Show("Ran");
        }
    }
}

当我使用即时窗口调用read()方法时,后台工作者的doWork方法中的命令不会运行。逐行对问题进行解块显示read()方法正在运行,但它没有以某种方式调用RunworkerAsync。

*Update1:启动线程也不起作用:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TradeStates
{
    
    public class ST
    {
        
        public static void Read()
        {
            Thread thr = new Thread(new ThreadStart(MSGshow));
            thr.Start();
        }
        public static void MSGshow()
        {
            MessageBox.Show("Ran");
        }


    }
}


共1个答案

匿名用户

DoWork事件被激发一次以执行后台工作,并且不能执行任何访问UI控件/UI线程的操作。

您还可以使用另外两个事件。ProgressChanged用于报告进度。例如,您可以实现该方法来更新进度条。另一个,也是我认为您应该感兴趣的是runworkercompleted。在你的情况下你会有

bgwMessage.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(BgwFileOpen_ShowDialog);
...
private void BgwFileOpen_ShowDialog(object sender, RunWorkerCompletedEventArgs e)
{
    MessageBox.Show("Ran");
}

最后的想法

  • 后台工作者通常应是form或其他winforms类的属性,因为backgroundworker继承自component
  • 当后台工作者的父级被释放时,它应该调用后台工作者的dispose()
  • 如果您必须从read()创建并启动worker,我建议您启动一个thread,并在完成时让它向UI线程发送一条消息。然后,您的消息处理程序将启动消息框。

BackgroundWorker类文档提供了如何正确使用该类的一个很好的示例。