我正在編寫一個執行特定任務(檢查某些內容)的程序,當我使用後臺工作(多個)時,它們會執行多次。我只希望他們執行一次。C#中的BackgroundWorker運行多次
我有一個按鈕,用下面的代碼:
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Text Documents|*.txt|All Files|*.*";
ofd.ShowDialog();
string filename = ofd.FileName;
SortList(filename);
排序列表功能,將文件分類成多個列表,我稍後將使用背景工人。
public void SortList(string file)
{
string[] names = System.IO.File.ReadAllLines(file);
int list = 1;
for (int i = 0; i < names.Length; i++)
{
switch (list)
{
case 1:
l1.Add(names[i]);
break;
case 2:
l2.Add(names[i]);
break;
case 3:
l3.Add(names[i]);
break;
case 4:
l4.Add(names[i]);
break;
case 5:
l1.Add(names[i]);
list = 1;
break;
}
list++;
}
backgroundWorker1.RunWorkerAsync();
backgroundWorker2.RunWorkerAsync();
backgroundWorker3.RunWorkerAsync();
backgroundWorker4.RunWorkerAsync();
}
有這個功能沒有問題,我已經調試它,並且列出了被分裂,因爲他們應該,沒有多餘的線條等問題是後臺工作人員做的工作多次。
我最後的作用是檢查一個,它看起來像這樣:
public void CheckList(List<string> names)
{
for (int i = 0; i < names.Count(); i++)
{
try
{
foreach (string s in names)
{
uu.parsePage("Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)", s);
string[] r = { uu.followers.ToString(), uu.followingcount, uu.isVerified.ToString() };
listView1.Invoke(new Action(() => listView1.Items.Add(uu.username).SubItems.AddRange(r)));
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
而且每個背景工人有這樣的代碼:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
CheckList(l1);
}
private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{
CheckList(l2);
}
private void backgroundWorker3_DoWork(object sender, DoWorkEventArgs e)
{
CheckList(l3);
}
private void backgroundWorker4_DoWork(object sender, DoWorkEventArgs e)
{
CheckList(l4);
}
我做了一些調試和我可以不知道爲什麼背景工作者多次做這項工作。是否有一些衝突或我做錯了什麼?謝謝。
示例文件我用:
danbilzerian
dailywatch
fitness
fitspo
bodyofrachael
這5項和後臺工作人員做了一些工作多次,這最終看起來像這樣:
爲什麼在同一列表中存在內部循環時存在外部循環? – user3185569