2016-05-29 40 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