建议一种多线程方法

时间:2016-05-29 18:07:57

标签: c# multithreading

我有一个方法,它将字节数组和一个int数作为输入,并将从数组中提取的输出写入以int number命名的新文本文件。假设我有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
    }
}

我做错了什么,请建议更改。

2 个答案:

答案 0 :(得分:0)

您可以查看TPL数据流,可能有点过多,但它提供了一种通过高效并行化将作业拆分为较小任务的好方法。

这里有一个很好的介绍https://vimeo.com/97415351

答案 1 :(得分: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));
}