最近项目中遇到一个应用场景,即需要调用同一个函数256次(函数执行时长20毫秒,耗时总长为20*256毫秒,即5.12秒),每次传入的参数略有不同,最后根据返回结果从中选择正确的那一次调用结果,最初采用一个for循环,每次都从0开始至255结束,后来想到可以用并发思路,一次性生成256个Task,这样耗时相当于一个Task的时长,从5120毫秒的总耗时下降到20毫秒,大大提高了软件的执行效率。
下面用一个示例来说明,整个过程只需要三步,分别是:第一步,首先我们创建两个类,分别代表传入的参数和返回的结果
//传入的参数类
public class Model
{
public int Number{get;set;}
}
//返回的结果类
public class Result
{
public int Value{get;set;}
public Model Source{get;set;}
}
第二步,编写一个用于并发调用的函数
//并发函数
public Result Concurrency(object state)
{
Model model = state as Model;
Result result = new Result();
result.Source = model;
if(model.Number == 999)
{
result.Value = 1;
}
//模拟耗时
Thread.Sleep(20);
return result;
}
第三步,编写并发代码,实现并发流程
List<Task> tasks = new List<Task>();
for(int = 0;i < 1000;i++)
{
Model state = new Model(){Number=i};
var task = Task<Result>.Factory.StartNew(new Func<object,Result>(Method),state);
tasks.Add(task);
}
Task.WaitAll(tasks.ToArray());
//待所有Task都运行完毕后,从中筛选正确的结果
var t = tasks.FirstOrDefault(item=>((Task<Result>(item).Result.Value == 1) as Task<Result>;
MessageBox.Show("Source="+t.Result.Source.Number);