【发布时间】:2017-06-08 08:44:51
【问题描述】:
我是 C# 和面向对象编程的新手。我有一个解析文本文件的应用程序。
默认情况下,程序在主线程上执行,因此应用程序会冻结直到执行。
我有 5 个 void 方法,它们将 string 列表作为参数。
根据各种 CheckBox 选项,这 5 个 void 方法组合执行。
BackgroundWorker 在不同的线程上执行操作。因此,应用程序不会冻结。
但是,对于每个组合,我需要 15+ BackgroundWorkers。
以下是我的代码:
public partial class Form1 : Form
{
List<string> textFiles = new List<string>();
public Form1()
{
InitializeComponent();
}
public void mParsing(List<string> textFiles) { /* parsing logic */ }
public void iParsing(List<string> textFiles) { /* parsing logic */ }
public void aParsing(List<string> textFiles) { /* parsing logic */ }
public void qParsing(List<string> textFiles) { /* parsing logic */ }
public void Summary()
{
// Logic to generate summary
}
private void btnGo_Click(object sender, EventArgs e)
{
if (checkM.Checked == true && checkI.Checked == false && checkA.Checked == false && checkQ.Checked == false)
{
backgroundWorker1.RunWorkerAsync();
}
else if (checkM.Checked == true && checkI.Checked == true && checkA.Checked == false && checkQ.Checked == false)
{
backgroundWorker2.RunWorkerAsync();
}
//So On....
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
mParsing(textFiles);
Summary();
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
DialogResult dialogResult = MessageBox.Show("View Summary?", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
string summary = filepath;
Process.Start("notepad.exe", summary);
}
}
private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{
mParsing(textFiles);
iParsing(textFiles);
Summary();
}
private void backgroundWorker2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
DialogResult dialogResult = MessageBox.Show("View Summary?", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
string summary = filepath;
Process.Start("notepad.exe", summary);
}
}
}
Func<> 不接受 void 数据类型,我很难理解委托和多线程。
我的问题是,我不知道如何避免多个后台工作人员。这可以在代表的帮助下实现吗?
更新: .NET Framework 版本:4.0
【问题讨论】:
-
您是否使用 backgroundworker 只是因为这是您发现执行多线程的第一种方法并且您坚持使用它?还是出于某种特定原因?我问是因为它处理线程的方式有点过时。正如您所发现的那样,它过于复杂。
-
@Jamiec,我使用了后台工作程序,因为我过去曾在 VB.NET 应用程序中使用过它。上述方法需要按顺序运行。如何实现?此外,我们将不胜感激。
-
RunWorkerAsync() 允许您将参数传递给 DoWork。很明显,你会在这里很好地使用它,一个 BGW 就足够了。
-
@Hans 但我需要将多个方法传递给 DoWork。它不允许我通过 backgroundWorker1.RunWorkerAsync(mParsing(textFiles), Summary());
-
它允许你传递 any 对象。只需创建您自己的小类,它可以包含您需要的任意数量的字段。您将调用的方法应该在 DoWork 代码中。但是,如果出于某种原因方便的话,您可以将该类的一个字段声明为委托。
标签: c# multithreading methods delegates backgroundworker