我有一个方法,它将字节数组和一个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
}
}
我做错了什么,请建议更改。
答案 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));
}