C# 多線程、異步線程(TaskFactory )、線程同步 (Parallel)

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個線程同時啓動的時間差異;

時間有限,就這樣了!

 

 

發佈了24 篇原創文章 · 獲贊 21 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章