我是C#和麪向對象編程的新手。我有一個解析文本文件的應用程序。C# - 代表和BackgroundWorkers
默認情況下,程序在主線程上執行,因此應用程序凍結直至執行。
我有5個空白方法,它們以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<>
不接受無效的數據類型,我有一個壞的時間瞭解代表和多線程技術。
我的問題是,我不知道如何避免多個後臺工作人員。這可以在代表的幫助下實施嗎?
更新: .NET Framework版本:4.0
您是否在使用backgroundworker,因爲這是您發現多線程的第一種方式,而且您堅持使用它嗎?或者出於某些特定原因?我問,因爲它有點過時的方式來處理線程。正如你發現它過於複雜。 – Jamiec
@Jamiec,我使用了後臺工作者,因爲我在過去使用過VB.NET應用程序。上述方法需要按順序運行。這怎麼能實現?另外,解釋將不勝感激。 – Tango
RunWorkerAsync()允許您將參數傳遞給DoWork。顯然你會在這裏有很好的用處,一個BGW就足夠了。 –