我有一個程序包含2個列表框,這個程序是基於搜索文件,然後與StopWatch
區別使用AsyncAwait
和TPL ...第一個列表框使用AsyncAwait
(I不知道這是否是更好的方式做,但它的工作原理,請參閱下面我的代碼)並行for each搜索文件
private async void button1_Click(object sender, EventArgs e)
{
Stopwatch stopWatch = new Stopwatch();
foreach (string d in Directory.GetDirectories(@"C:\Visual Studio Projectes\Hash\AsyncAwait\Carpetes"))
{
foreach (string s in Directory.GetFiles(d))
{
stopWatch.Start();
listBox1.Items.Add(s);
await Task.Delay(1);
btIniciar1.Enabled = false;
}
}
btIniciar1.Enabled = true;
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
textBox1.Text = ts.ToString("mm\\:ss\\.ff") + (" minuts");
}
然後在我的第二個列表框就是我堅持,我不知道如何實現Parallel.ForEach
像async
一樣,有什麼更好的方法來做到這一點?在這種情況下,我無法找到使用TPL的方式來執行與我的第一個列表框相同的操作,請問您能幫助我嗎?
您是使用winforms還是WPF?此外,如果您只是想將文件列表添加到'listBox1'中,您的操作並不完全清楚。如果是這樣,您的並行解決方案將會變得更慢,因爲您一次只能有一個線程添加項目,每個人都必須等待。如果您正在做其他事情,ForEach可能會更好地工作,但您需要告訴我們您的ForEach會真正做什麼。 – 2015-02-24 15:18:55
我正在使用winforms – Dix 2015-02-24 15:20:34
Parallel.ForEach會對此很糟糕,因爲只有UI線程才能更新UI,所以您必須切換回此線程才能將文件實際添加到列表中。如果你真的必須嘗試這種實驗,最好從函數返回一個字符串數組(例如文件名)。 – samjudson 2015-02-24 15:23:06