我对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");
}
}
}
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类文档提供了如何正确使用该类的一个很好的示例。