1、Task舉例
1.案例場景,現在有server有一個不固定數的任務請求,假設是個,但是做的是相同的事情。簡而言之就是根據server端的請求個數來到Client來動態的開線程,調用Client的程序邏輯。
方式一:
List<System.Threading.Tasks.Task> taskList = new List<System.Threading.Tasks.Task>();
for (int i = 0; i < list.Count; i++)
{
System.Threading.Tasks.Task aTask =
taskFactory.StartNew(() =>
{
Coding(i, i + new Random().Next(1, 10));
});
System.Threading.Thread.Sleep(100);
taskList.Add(aTask);
}
方式二
TaskFactory taskFactory = new TaskFactory();
Stopwatch sw = new Stopwatch();
List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8 };
List<System.Threading.Tasks.Task> taskList = new List<System.Threading.Tasks.Task>();
for (int i = 0; i < list.Count; i++)
{
System.Threading.Tasks.Task aTask =
taskFactory.StartNew((x) =>
{
Coding((int)x, (int)x + new Random().Next(1, 10));
}, i);
System.Threading.Thread.Sleep(100);
taskList.Add(aTask);
}
Task.WaitAll(taskList.ToArray());
Console.WriteLine("所有Task執行完畢");
Console.ReadKey();
以上兩種方式的執行結果,問題很大,沒把我整死。主要也是自己菜。
static int Coding(int name, int content)
{
int k = name;
Console.WriteLine("當前K : " + k + DateTime.Now.ToString("yyyy-mm-dd:HH:mm:ss:ffff"));
int delay = new Random().Next(100,10000);
System.Threading.Thread.Sleep(delay);
int s = k + content;
Console.WriteLine("第" + k + "次,完成了" + "延時了" + delay);
//System.Threading.Thread.Sleep(100);
return s;
}
方式一會有併發,方式二以參數的形式將i傳進去是OK的,至少能保證傳進去的i值不會發生改變。
線程並行也可以實現 Parallel
List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8 };
int k = list.Count();
ParallelLoopResult result = Parallel.For(0, k, x =>
{
System.Threading.Thread.Sleep(100);
Coding(list[x], x + new Random().Next(1, 10));
});
while (result.IsCompleted)
{
Console.WriteLine("ttt");
break;
}
記錄線程並行的情況下,8個線程同時啓動的時間差異;
時間有限,就這樣了!