2016-05-29 73 views
0

我有一種方法,它將字節數組和int數作爲輸入,並將從數組中提取的輸出寫入以int數命名的新文本文件。假設我有6個整數,並且我想從字節數組中爲這些整數中的每一個並行提取信息,那麼您會建議採用哪種多線程方法?建議一種多線程方法

目前我正在使用async/await,但與同步方法相比,此代碼需要更多時間。

private async void button1_Click(object sender, EventArgs e) 
{ 
    byte[] dec = File.ReadAllBytes(@"filepath"); 
    DateTime fdate = offset.AddDays(dateadd); 
    int[] telemetry = { 1, 2, 3 }; 
    DateTime test1 = DateTime.Now; 
    var tasks = new List<Task>(); 
    foreach (int tm in telemetry) 
    { 
     tasks.Add(RunAsync(dec, tm, fdate)); 
    } 
    await Task.WhenAll(tasks); 
    DateTime test2 = DateTime.Now; 
    draw(telemetry); 
    Console.WriteLine(test2.Subtract(test1)); 
} 

async Task RunAsync(byte[] dec, int tm, DateTime fdate) 
{ 
    chartControl1.Series.Add(tm.ToString(), ViewType.Line); 
    using (StreamWriter writer = new StreamWriter(@"outputpath" + tm.ToString() + ".txt", true)) 
    { 
     //DO PROCESSING 
    } 
} 

我做錯了什麼,請建議更改。

+0

您可以使用'AsParallel()。ForEach()' – Valentin

+1

「DO PROCESSING」中會發生什麼?請注意,async/await不會自動使用多個線程。它使代碼異步,但不一定是多線程的。 –

+0

@Valentin謝謝,'Parallel.ForEach()'正在爲我工​​作。 –

回答

0

我能夠使用`Parallel.ForEach()循環而不是async/await關鍵字來減少處理時間。這裏是示例修改的代碼。

private async void button1_Click(object sender, EventArgs e) 
{ 
byte[] dec = File.ReadAllBytes(@"filepath"); 
DateTime fdate = offset.AddDays(dateadd); 
int[] telemetry = { 1, 2, 3 }; 
DateTime test1 = DateTime.Now; 
Parallel.ForEach (telemetry,tm=> 
{ 
    using(StreamWriter writer = new StreamWriter("outputpath"+tm.ToString()+".txt", true)) 
    { 
    //DO PROCESSING 
    } 
}); 
DateTime test2 = DateTime.Now; 
draw(telemetry); 
Console.WriteLine(test2.Subtract(test1)); 
} 
0

您可以查看TPL數據流,可能有點太多,但它提供了一種很好的方式,可以通過高效的並行化將作業分成更小的任務。

一個很好的介紹可以在這裏找到https://vimeo.com/97415351