Task多线程,带返回值,带参数,并等待所有线程返回

 1  public void TestMethod1()
 2         {
 3             var strArr = new string[25];
 4             var list = new List<string>();
 5             for (int i = 0; i < 25; i++)
 6             {
 7                 strArr[i] = i.ToString();
 8             }
 9             var numb = 10;
10             var integer = strArr.Length / numb;
11             var remainder = strArr.Length % numb;
12             var tNumb = integer == 0 ? integer : integer + 1;
13 
14             if (integer <= 0)
15             {
16                 //直接执行,不开线程
17             }
18             else
19             {
20 
21                 Task<List<string>>[] tasks = new Task<List<string>>[tNumb];
22 
23                 for (int i = 0; i < integer; i++)
24                 {
25                     var arrs = new string[numb];
26                     var p = (i * numb);
27                     Array.Copy(strArr, p, arrs, 0, numb);
28                     Func<List<string>> fun = ()=> vvvv(arrs);
29                     tasks[i] = Task.Factory.StartNew(fun);
30                 }
31                 if (remainder > 0)
32                 {
33                     var arrs = new string[remainder];
34                     Array.Copy(strArr, integer * numb, arrs, 0, remainder);
35                     tasks[tNumb - 1]  = Task.Factory.StartNew<List<string>>(() => vvvv(arrs));
36                 }
37                 var overTask = 0;
38                 while (overTask != tasks.Length)
39                 {
40                     for (int i = 0; i < tasks.Length; i++)
41                     {
42                         if ((tasks[i] != null) && ((tasks[i].IsCanceled || tasks[i].IsCompleted) || tasks[i].IsFaulted))
43                         {
44                             list.AddRange(tasks[i].Result);
45                             tasks[i].Dispose();
46                             tasks[i] = null;
47                             overTask++;
48                         }
49                     }
50                 }
51                 var www = list.Distinct().ToList();
52             }
53         }
54 
55         public List<string> vvvv(string [] arrs )
56         {
57             var lists = new List<string>();
58             for (int e = 0; e < arrs.Length; e++)
59             {
60                 lists.Add(arrs[e]);
61             }
62             return (lists);
63             //执行代码。
64         }

 

posted @ 2015-08-05 10:50  mimo0  阅读(1183)  评论(0)    收藏  举报