{"id":7089,"date":"2023-09-28T08:40:26","date_gmt":"2023-09-28T00:40:26","guid":{"rendered":"https:\/\/i007.vip:15443\/wordpress\/?p=7089"},"modified":"2023-09-28T08:40:26","modified_gmt":"2023-09-28T00:40:26","slug":"c-task%e8%af%a6%e8%a7%a3","status":"publish","type":"post","link":"https:\/\/i007.cc\/wordpress\/archives\/7089","title":{"rendered":"C# Task\u8be6\u89e3"},"content":{"rendered":"<p><a href=\"https:\/\/blog.csdn.net\/feritylamb\/article\/details\/129322457\">cc from<\/a><\/p>\n<p>&nbsp;<\/p>\n<p>\u5c0f\u84dd\u6ce2<\/p>\n<p>\u4e8e 2023-03-03 16:25:53 \u53d1\u5e03<\/p>\n<p>3991<br \/>\n\u6536\u85cf 26<br \/>\n\u6587\u7ae0\u6807\u7b7e\uff1a c# \u5f00\u53d1\u8bed\u8a00<br \/>\n\u7248\u6743<br \/>\n1\u3001Task\u4ea7\u751f\u80cc\u666f<br \/>\nTask\u51fa\u73b0\u4e4b\u524d\uff0c\u5fae\u8f6f\u7684\u591a\u7ebf\u7a0b\u5904\u7406\u65b9\u5f0f\u6709\uff1aThread\u2192ThreadPool\u2192\u59d4\u6258\u7684\u5f02\u6b65\u8c03\u7528\uff0c\u867d\u7136\u4e5f\u53ef\u4ee5\u57fa\u672c\u4e1a\u52a1\u9700\u8981\u7684\u591a\u7ebf\u7a0b\u573a\u666f\uff0c\u4f46\u5b83\u4eec\u5728\u591a\u4e2a\u7ebf\u7a0b\u7684\u7b49\u5f85\u5904\u7406\u65b9\u9762\u3001\u8d44\u6e90\u5360\u7528\u65b9\u9762\u3001\u7ebf\u7a0b\u5ef6\u7eed\u548c\u963b\u585e\u65b9\u9762\u3001\u7ebf\u7a0b\u7684\u53d6\u6d88\u65b9\u9762\u7b49\u90fd\u663e\u5f97\u6bd4\u8f83\u7b28\u62d9\uff0c\u5728\u9762\u5bf9\u590d\u6742\u7684\u4e1a\u52a1\u573a\u666f\u4e0b\uff0c\u663e\u5f97\u6709\u70b9\u6349\u895f\u89c1\u8098\u4e86\u3002<\/p>\n<p>ThreadPool\u76f8\u6bd4Thread\u6765\u8bf4\u5177\u5907\u4e86\u5f88\u591a\u4f18\u52bf\uff0c\u4f46\u662fThreadPool\u5374\u53c8\u5b58\u5728\u4e00\u4e9b\u4f7f\u7528\u4e0a\u7684\u4e0d\u65b9\u4fbf\u3002\u6bd4\u5982\uff1a<\/p>\n<p>ThreadPool\u4e0d\u652f\u6301\u7ebf\u7a0b\u7684\u53d6\u6d88\u3001\u5b8c\u6210\u3001\u5931\u8d25\u901a\u77e5\u7b49\u4ea4\u4e92\u6027\u64cd\u4f5c\uff1b<br \/>\nThreadPool\u4e0d\u652f\u6301\u7ebf\u7a0b\u6267\u884c\u7684\u5148\u540e\u6b21\u5e8f\uff1b<br \/>\n\u6b63\u662f\u5728\u8fd9\u79cd\u80cc\u666f\u4e0b\uff0cTask\u5e94\u8fd0\u800c\u751f\u3002Task\u662f\u5fae\u8f6f\u5728.Net 4.0\u65f6\u4ee3\u63a8\u51fa\u6765\u7684\uff0c\u4e5f\u662f\u5fae\u8f6f\u6781\u529b\u63a8\u8350\u7684\u4e00\u79cd\u591a\u7ebf\u7a0b\u7684\u5904\u7406\u65b9\u5f0f\uff0cTask\u770b\u8d77\u6765\u50cf\u4e00\u4e2aThread\uff0c\u5b9e\u9645\u4e0a\uff0c\u5b83\u662f\u5728ThreadPool\u7684\u57fa\u7840\u4e0a\u8fdb\u884c\u7684\u5c01\u88c5\uff0cTask\u7684\u63a7\u5236\u548c\u6269\u5c55\u6027\u5f88\u5f3a\uff0c\u5728\u7ebf\u7a0b\u7684\u5ef6\u7eed\u3001\u963b\u585e\u3001\u53d6\u6d88\u3001\u8d85\u65f6\u7b49\u65b9\u9762\u8fdc\u80dc\u4e8eThread\u548cThreadPool\u3002\u4ee5\u4e0b\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u4efb\u52a1\u793a\u4f8b\uff1a<\/p>\n<p>static void Main(string[] args)<br \/>\n{<br \/>\nTask t = new Task(() =&gt;<br \/>\n{<br \/>\nConsole.WriteLine(&#8220;\u4efb\u52a1\u5f00\u59cb\u5de5\u4f5c\u2026\u2026&#8221;);<br \/>\nThread.Sleep(5000); \/\/\u6a21\u62df\u5de5\u4f5c\u8fc7\u7a0b<br \/>\n});<br \/>\nt.Start();<br \/>\nt.ContinueWith(task =&gt;<br \/>\n{<br \/>\nConsole.WriteLine(&#8220;\u4efb\u52a1\u5b8c\u6210\uff0c\u5b8c\u6210\u65f6\u5019\u7684\u72b6\u6001\u4e3a\uff1a&#8221;);<br \/>\nConsole.WriteLine(&#8220;IsCanceled={0}\\tIsCompleted={1}\\tIsFaulted={2}&#8221;,<br \/>\ntask.IsCanceled, task.IsCompleted, task.IsFaulted);<br \/>\n});<br \/>\nConsole.ReadKey();<br \/>\n}<br \/>\n2\u3001Task\u4f7f\u7528\u65b9\u6cd5<br \/>\n2.1\u3000\u521b\u5efa\u548c\u542f\u52a8\u4efb\u52a1<br \/>\n2.1.1 \u65e0\u8fd4\u56de\u503c\u7684\u65b9\u5f0f<\/p>\n<p>\u65b9\u5f0f1:\u8c03\u7528Start\u65b9\u6cd5<\/p>\n<p>var t1 = new Task(() =&gt; TaskMethod(&#8220;Task 1&#8221;));<br \/>\nt1.Start();<br \/>\nTask.WaitAll(t1);\/\/\u7b49\u5f85\u6240\u6709\u4efb\u52a1\u7ed3\u675f<br \/>\n\u4efb\u52a1\u7684\u72b6\u6001\uff1aStart\u4e4b\u524d\u4e3aCreated\uff0c\u4e4b\u540e\u4e3aWaitingToRun<\/p>\n<p>\u65b9\u5f0f2:\u9759\u6001\u65b9\u6cd5Run<\/p>\n<p>Task.Run(() =&gt; TaskMethod(&#8220;Task 2&#8221;));<br \/>\n\u65b9\u5f0f3:TaskFactory\u5de5\u5382<\/p>\n<p>\/\/ \u65b9\u6cd51. TaskFactory\u5de5\u5382<br \/>\nTaskFactory taskFactory = new TaskFactory() ;<br \/>\ntaskFactory.StartNew(() =&gt; TaskMethod(&#8220;Task 3&#8221;));<br \/>\n\/\/ \u65b9\u6cd52. Task.Factory\u5c5e\u6027<br \/>\nTask.Factory.StartNew(() =&gt; TaskMethod(&#8220;Task 3&#8221;));<br \/>\n\/\/\u6216\u8005<br \/>\nvar t3=Task.Factory.StartNew(() =&gt; TaskMethod(&#8220;Task 3&#8221;));<br \/>\nTask.WaitAll(t3);<br \/>\n\u4efb\u52a1\u7684\u72b6\u6001\uff1aStart\u4e4b\u524d\u4e3aRunning\uff0c\u4e4b\u540e\u4e3aRunning<\/p>\n<p>static void Main(string[] args)<br \/>\n{<br \/>\nvar t1 = new Task(() =&gt; TaskMethod(&#8220;Task 1&#8221;));<br \/>\nvar t2 = new Task(() =&gt; TaskMethod(&#8220;Task 2&#8221;));<br \/>\nt2.Start();<br \/>\nt1.Start();<br \/>\nTask.WaitAll(t1, t2);<br \/>\nTask.Run(() =&gt; TaskMethod(&#8220;Task 3&#8221;));<br \/>\nTask.Factory.StartNew(() =&gt; TaskMethod(&#8220;Task 4&#8221;));<br \/>\n\/\/\u6807\u8bb0\u4e3a\u957f\u65f6\u95f4\u8fd0\u884c\u4efb\u52a1,\u5219\u4efb\u52a1\u4e0d\u4f1a\u4f7f\u7528\u7ebf\u7a0b\u6c60,\u800c\u5728\u5355\u72ec\u7684\u7ebf\u7a0b\u4e2d\u8fd0\u884c\u3002<br \/>\nTask.Factory.StartNew(() =&gt; TaskMethod(&#8220;Task 5&#8221;), TaskCreationOptions.LongRunning);<\/p>\n<p>#region \u5e38\u89c4\u7684\u4f7f\u7528\u65b9\u5f0f<br \/>\nConsole.WriteLine(&#8220;\u4e3b\u7ebf\u7a0b\u6267\u884c\u4e1a\u52a1\u5904\u7406.&#8221;);<br \/>\n\/\/\u521b\u5efa\u4efb\u52a1<br \/>\nTask task = new Task(() =&gt;<br \/>\n{<br \/>\nConsole.WriteLine(&#8220;\u4f7f\u7528`System.Threading.Tasks.Task`\u6267\u884c\u5f02\u6b65\u64cd\u4f5c.&#8221;);<br \/>\nfor (int i = 0; i &lt; 10; i++)<br \/>\n{<br \/>\nConsole.WriteLine(i);<br \/>\n}<br \/>\n});<br \/>\n\/\/\u542f\u52a8\u4efb\u52a1,\u5e76\u5b89\u6392\u5230\u5f53\u524d\u4efb\u52a1\u961f\u5217\u7ebf\u7a0b\u4e2d\u6267\u884c\u4efb\u52a1(System.Threading.Tasks.TaskScheduler)<br \/>\ntask.Start();<br \/>\nConsole.WriteLine(&#8220;\u4e3b\u7ebf\u7a0b\u6267\u884c\u5176\u4ed6\u5904\u7406&#8221;);<br \/>\ntask.Wait();<br \/>\n#endregion<\/p>\n<p>Thread.Sleep(TimeSpan.FromSeconds(1));<br \/>\nConsole.ReadLine();<br \/>\n}<\/p>\n<p>static void TaskMethod(string name)<br \/>\n{<br \/>\nConsole.WriteLine(&#8220;Task {0} is running on a thread id {1}. Is thread pool thread: {2}&#8221;,<br \/>\nname, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);<br \/>\n}<br \/>\n\u65b9\u5f0f4:RunSynchronously\u540c\u6b65\u542f\u52a8<\/p>\n<p>Task\u5b9e\u4f8b\u5316\u540e\u8c03\u7528\u540c\u6b65\u65b9\u6cd5RunSynchronously\uff0c\u8fdb\u884c\u7ebf\u7a0b\u542f\u52a8\u3002(PS: \u7c7b\u4f3c\u59d4\u6258\u5f00\u542f\u7ebf\u7a0b\uff0cBeginInvoke\u662f\u5f02\u6b65\uff0c\u800cInvoke\u662f\u540c\u6b65)<\/p>\n<p>var task = new Task(() =&gt; TaskMethod(&#8220;Task 1&#8221;));<br \/>\ntask.RunSynchronously();<br \/>\nasync\/await\u7684\u5b9e\u73b0\u65b9\u5f0f<\/p>\n<p>using System;<br \/>\nusing System.Threading;<br \/>\nusing System.Threading.Tasks;<\/p>\n<p>namespace ConsoleApp1<br \/>\n{<br \/>\nclass Program<br \/>\n{<br \/>\nasync static void AsyncFunction()<br \/>\n{<br \/>\nawait Task.Delay(1);<br \/>\nConsole.WriteLine(&#8220;\u4f7f\u7528`System.Threading.Tasks.Task`\u6267\u884c\u5f02\u6b65\u64cd\u4f5c.&#8221;);<br \/>\nfor (int i = 0; i &lt; 10; i++)<br \/>\n{<br \/>\nConsole.WriteLine(string.Format(&#8220;AsyncFunction:i={0}&#8221;, i));<br \/>\n}<br \/>\n}<\/p>\n<p>public static void Main()<br \/>\n{<br \/>\nConsole.WriteLine(&#8220;\u4e3b\u7ebf\u7a0b\u6267\u884c\u4e1a\u52a1\u5904\u7406.&#8221;);<br \/>\nAsyncFunction();<br \/>\nConsole.WriteLine(&#8220;\u4e3b\u7ebf\u7a0b\u6267\u884c\u5176\u4ed6\u5904\u7406&#8221;);<br \/>\nfor (int i = 0; i &lt; 10; i++)<br \/>\n{<br \/>\nConsole.WriteLine(string.Format(&#8220;Main:i={0}&#8221;, i));<br \/>\n}<br \/>\nConsole.ReadLine();<br \/>\n}<br \/>\n}<br \/>\n}<br \/>\n2.1.2 \u5e26\u8fd4\u56de\u503c\u7684\u65b9\u5f0f<\/p>\n<p>\u65b9\u5f0f4:<\/p>\n<p>Task&lt;int&gt; task = CreateTask(&#8220;Task 1&#8221;);<br \/>\ntask.Start();<br \/>\nint result = task.Result;<br \/>\nusing System;<br \/>\nusing System.Threading;<br \/>\nusing System.Threading.Tasks;<\/p>\n<p>namespace ConsoleApp1<br \/>\n{<br \/>\nclass Program<br \/>\n{<br \/>\nstatic Task&lt;int&gt; CreateTask(string name)<br \/>\n{<br \/>\nreturn new Task&lt;int&gt;(() =&gt; TaskMethod(name));<br \/>\n}<\/p>\n<p>static void Main(string[] args)<br \/>\n{<br \/>\nTaskMethod(&#8220;Main Thread Task&#8221;);<br \/>\nTask&lt;int&gt; task = CreateTask(&#8220;Task 1&#8221;);<br \/>\ntask.Start();<br \/>\nint result = task.Result;<br \/>\nConsole.WriteLine(&#8220;Task 1 Result is: {0}&#8221;, result);<\/p>\n<p>task = CreateTask(&#8220;Task 2&#8221;);<br \/>\ntask.RunSynchronously(); \/\/\u8be5\u4efb\u52a1\u4f1a\u8fd0\u884c\u5728\u4e3b\u7ebf\u7a0b\u4e2d<br \/>\nresult = task.Result;<br \/>\nConsole.WriteLine(&#8220;Task 2 Result is: {0}&#8221;, result);<\/p>\n<p>task = CreateTask(&#8220;Task 3&#8221;);<br \/>\nConsole.WriteLine(task.Status);<br \/>\ntask.Start();<\/p>\n<p>while (!task.IsCompleted)<br \/>\n{<br \/>\nConsole.WriteLine(task.Status);<br \/>\nThread.Sleep(TimeSpan.FromSeconds(0.5));<br \/>\n}<\/p>\n<p>Console.WriteLine(task.Status);<br \/>\nresult = task.Result;<br \/>\nConsole.WriteLine(&#8220;Task 3 Result is: {0}&#8221;, result);<\/p>\n<p>#region \u5e38\u89c4\u4f7f\u7528\u65b9\u5f0f<br \/>\n\/\/\u521b\u5efa\u4efb\u52a1<br \/>\nTask&lt;int&gt; getsumtask = new Task&lt;int&gt;(() =&gt; Getsum());<br \/>\n\/\/\u542f\u52a8\u4efb\u52a1,\u5e76\u5b89\u6392\u5230\u5f53\u524d\u4efb\u52a1\u961f\u5217\u7ebf\u7a0b\u4e2d\u6267\u884c\u4efb\u52a1(System.Threading.Tasks.TaskScheduler)<br \/>\ngetsumtask.Start();<br \/>\nConsole.WriteLine(&#8220;\u4e3b\u7ebf\u7a0b\u6267\u884c\u5176\u4ed6\u5904\u7406&#8221;);<br \/>\ngetsumtask.Wait(); \/\/\u7b49\u5f85\u4efb\u52a1\u7684\u5b8c\u6210\u6267\u884c\u8fc7\u7a0b<br \/>\nConsole.WriteLine(&#8220;\u4efb\u52a1\u6267\u884c\u7ed3\u679c\uff1a{0}&#8221;, getsumtask.Result.ToString());\/\/\u83b7\u5f97\u4efb\u52a1\u7684\u6267\u884c\u7ed3\u679c<br \/>\n#endregion<br \/>\n}<\/p>\n<p>static int TaskMethod(string name)<br \/>\n{<br \/>\nConsole.WriteLine(&#8220;Task {0} is running on a thread id {1}. Is thread pool thread: {2}&#8221;,<br \/>\nname, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);<br \/>\nThread.Sleep(TimeSpan.FromSeconds(2));<br \/>\nreturn 42;<br \/>\n}<\/p>\n<p>static int Getsum()<br \/>\n{<br \/>\nint sum = 0;<br \/>\nConsole.WriteLine(&#8220;\u4f7f\u7528`Task`\u6267\u884c\u5f02\u6b65\u64cd\u4f5c.&#8221;);<br \/>\nfor (int i = 0; i &lt; 100; i++)<br \/>\n{<br \/>\nsum += i;<br \/>\n}<br \/>\nreturn sum;<br \/>\n}<br \/>\n}<br \/>\n}<br \/>\nusing System;<br \/>\nusing System.Threading.Tasks;<\/p>\n<p>namespace ConsoleApp1<br \/>\n{<br \/>\nclass Program<br \/>\n{<br \/>\npublic static void Main()<br \/>\n{<br \/>\nvar ret1 = AsyncGetsum();<br \/>\nConsole.WriteLine(&#8220;\u4e3b\u7ebf\u7a0b\u6267\u884c\u5176\u4ed6\u5904\u7406&#8221;);<br \/>\nfor (int i = 1; i &lt;= 3; i++)<br \/>\nConsole.WriteLine(&#8220;Call Main()&#8221;);<br \/>\nint result = ret1.Result; \/\/\u963b\u585e\u4e3b\u7ebf\u7a0b<br \/>\nConsole.WriteLine(&#8220;\u4efb\u52a1\u6267\u884c\u7ed3\u679c\uff1a{0}&#8221;, result);<br \/>\n}<\/p>\n<p>async static Task&lt;int&gt; AsyncGetsum()<br \/>\n{<br \/>\nawait Task.Delay(1);<br \/>\nint sum = 0;<br \/>\nConsole.WriteLine(&#8220;\u4f7f\u7528`Task`\u6267\u884c\u5f02\u6b65\u64cd\u4f5c.&#8221;);<br \/>\nfor (int i = 0; i &lt; 100; i++)<br \/>\n{<br \/>\nsum += i;<br \/>\n}<br \/>\nreturn sum;<br \/>\n}<br \/>\n}<br \/>\n}<br \/>\n2.2\u3000\u7ebf\u7a0b\u7b49\u5f85\u3001\u5ef6\u7eed\u548c\u7ec4\u5408<br \/>\n2.2.1 Task\u7684\u7ebf\u7a0b\u7b49\u5f85\u548c\u5ef6\u7eed\u4e3b\u8981\u4ee5\u4e0b\u51e0\u7c7b\uff1a<\/p>\n<p>Wait\uff1a\u9488\u5bf9\u5355\u4e2aTask\u7684\u5b9e\u4f8b\uff0c\u53ef\u4ee5task1.wait\u8fdb\u884c\u7ebf\u7a0b\u7b49\u5f85<br \/>\nWaitAny\uff1a\u7ebf\u7a0b\u5217\u8868\u4e2d\u4efb\u4f55\u4e00\u4e2a\u7ebf\u7a0b\u6267\u884c\u5b8c\u6bd5\u5373\u53ef\u6267\u884c\uff08\u963b\u585e\u4e3b\u7ebf\u7a0b\uff09<br \/>\nWaitAll\uff1a\u7ebf\u7a0b\u5217\u8868\u4e2d\u6240\u6709\u7ebf\u7a0b\u6267\u884c\u5b8c\u6bd5\u65b9\u53ef\u6267\u884c\uff08\u963b\u585e\u4e3b\u7ebf\u7a0b\uff09<br \/>\nWhenAny\uff1a\u4e0eContinueWith\u914d\u5408,\u7ebf\u7a0b\u5217\u8868\u4e2d\u4efb\u4f55\u4e00\u4e2a\u6267\u884c\u5b8c\u6bd5\uff0c\u5219\u7ee7\u7eedContinueWith\u4e2d\u7684\u4efb\u52a1\uff08\u5f00\u542f\u65b0\u7ebf\u7a0b\uff0c\u4e0d\u963b\u585e\u4e3b\u7ebf\u7a0b\uff09<br \/>\nWhenAll\uff1a\u4e0eContinueWith\u914d\u5408,\u7ebf\u7a0b\u5217\u8868\u4e2d\u6240\u6709\u7ebf\u7a0b\u6267\u884c\u5b8c\u6bd5\uff0c\u5219\u7ee7\u7eedContinueWith\u4e2d\u7684\u4efb\u52a1\uff08\u5f00\u542f\u65b0\u7ebf\u7a0b\uff0c\u4e0d\u963b\u585e\u4e3b\u7ebf\u7a0b\uff09<br \/>\nContinueWith\uff1a\u4e0eWhenAny\u6216WhenAll\u914d\u5408\u4f7f\u7528<br \/>\nContinueWhenAny\uff1a\u7b49\u4ef7\u4e8eTask\u7684WhenAny+ContinueWith<br \/>\nContinueWhenAll\uff1a\u7b49\u4ef7\u4e8eTask\u7684WhenAll+ContinueWith<br \/>\npublic static void Main()<br \/>\n{<br \/>\n\/\/\u521b\u5efa\u4e00\u4e2a\u4efb\u52a1<br \/>\nTask&lt;int&gt; task = new Task&lt;int&gt;(() =&gt;<br \/>\n{<br \/>\nint sum = 0;<br \/>\nConsole.WriteLine(&#8220;\u4f7f\u7528`Task`\u6267\u884c\u5f02\u6b65\u64cd\u4f5c.&#8221;);<br \/>\nfor (int i = 0; i &lt; 100; i++)<br \/>\n{<br \/>\nsum += i;<br \/>\n}<br \/>\nreturn sum;<br \/>\n});<br \/>\n\/\/\u542f\u52a8\u4efb\u52a1,\u5e76\u5b89\u6392\u5230\u5f53\u524d\u4efb\u52a1\u961f\u5217\u7ebf\u7a0b\u4e2d\u6267\u884c\u4efb\u52a1(System.Threading.Tasks.TaskScheduler)<br \/>\ntask.Start();<br \/>\nConsole.WriteLine(&#8220;\u4e3b\u7ebf\u7a0b\u6267\u884c\u5176\u4ed6\u5904\u7406&#8221;);<br \/>\n\/\/\u4efb\u52a1\u5b8c\u6210\u65f6\u6267\u884c\u5904\u7406\u3002<br \/>\nTask cwt = task.ContinueWith(t =&gt;<br \/>\n{<br \/>\nConsole.WriteLine(&#8220;\u4efb\u52a1\u5b8c\u6210\u540e\u7684\u6267\u884c\u7ed3\u679c\uff1a{0}&#8221;, t.Result.ToString());<br \/>\n});<br \/>\ntask.Wait();<br \/>\ncwt.Wait();<\/p>\n<p>Action&lt;string,int&gt; log = (name,time) =&gt;<br \/>\n{<br \/>\nConsole.WriteLine($&#8221;{name}\u4efb\u52a1\u5f00\u59cb&#8230;&#8221;);<br \/>\nThread.Sleep(time);<br \/>\nConsole.WriteLine($&#8221;{name}\u4efb\u52a1\u7ed3\u675f!&#8221;);<br \/>\n};<br \/>\nList&lt;Task&gt; tasks = new List&lt;Task&gt;<br \/>\n{<br \/>\nTask.Run(() =&gt; log(&#8220;\u5f20\u4e09&#8221;,3000)),<br \/>\nTask.Run(() =&gt; log(&#8220;\u674e\u56db&#8221;,1000)),<br \/>\nTask.Run(() =&gt; log(&#8220;\u738b\u4e94&#8221;,2000))<br \/>\n};<br \/>\n\/\/\u4ee5\u4e0b\u8bed\u53e5\u9010\u4e2a\u6d4b\u8bd5\u6548\u679c<br \/>\nTask.WaitAny(tasks.ToArray());<br \/>\nTask.WaitAll(tasks.ToArray());<br \/>\nTask.WhenAny(tasks.ToArray()).ContinueWith(x =&gt; Console.WriteLine(&#8220;\u67d0\u4e2aTask\u6267\u884c\u5b8c\u6bd5&#8221;));<br \/>\nTask.WhenAll(tasks.ToArray()).ContinueWith(x =&gt; Console.WriteLine(&#8220;\u6240\u6709Task\u6267\u884c\u5b8c\u6bd5&#8221;));<br \/>\nTask.Factory.ContinueWhenAny(tasks.ToArray(), x =&gt; Console.WriteLine(&#8220;\u67d0\u4e2aTask\u6267\u884c\u5b8c\u6bd5&#8221;));<br \/>\nTask.Factory.ContinueWhenAll(tasks.ToArray(), x =&gt; Console.WriteLine(&#8220;\u6240\u6709Task\u6267\u884c\u5b8c\u6bd5&#8221;));<br \/>\nConsole.Read();<br \/>\n}<br \/>\n2.2.2 \u4efb\u52a1\u7684\u4e32\u884c<\/p>\n<p>static void Main(string[] args)<br \/>\n{<br \/>\nConcurrentStack&lt;int&gt; stack = new ConcurrentStack&lt;int&gt;();<\/p>\n<p>\/\/t1\u5148\u4e32\u884c<br \/>\nvar t1 = Task.Factory.StartNew(() =&gt;<br \/>\n{<br \/>\nstack.Push(1);<br \/>\nstack.Push(2);<br \/>\n});<\/p>\n<p>\/\/t2,t3\u5e76\u884c\u6267\u884c<br \/>\nvar t2 = t1.ContinueWith(t =&gt;<br \/>\n{<br \/>\nint result;<br \/>\nstack.TryPop(out result);<br \/>\nConsole.WriteLine(&#8220;Task t2 result={0},Thread id {1}&#8221;, result, Thread.CurrentThread.ManagedThreadId);<br \/>\n});<\/p>\n<p>\/\/t2,t3\u5e76\u884c\u6267\u884c<br \/>\nvar t3 = t1.ContinueWith(t =&gt;<br \/>\n{<br \/>\nint result;<br \/>\nstack.TryPop(out result);<br \/>\nConsole.WriteLine(&#8220;Task t3 result={0},Thread id {1}&#8221;, result, Thread.CurrentThread.ManagedThreadId);<br \/>\n});<\/p>\n<p>\/\/\u7b49\u5f85t2\u548ct3\u6267\u884c\u5b8c<br \/>\nTask.WaitAll(t2, t3);<\/p>\n<p>\/\/t4\u4e32\u884c\u6267\u884c<br \/>\nvar t4 = Task.Factory.StartNew(() =&gt;<br \/>\n{<br \/>\nConsole.WriteLine(&#8220;\u5f53\u524d\u96c6\u5408\u5143\u7d20\u4e2a\u6570\uff1a{0},Thread id {1}&#8221;, stack.Count, Thread.CurrentThread.ManagedThreadId);<br \/>\n});<br \/>\nt4.Wait();<br \/>\n}<br \/>\n2.2.3 \u5b50\u4efb\u52a1<\/p>\n<p>public static void Main()<br \/>\n{<br \/>\nTask&lt;string[]&gt; parent = new Task&lt;string[]&gt;(state =&gt;<br \/>\n{<br \/>\nConsole.WriteLine(state);<br \/>\nstring[] result = new string[2];<br \/>\n\/\/\u521b\u5efa\u5e76\u542f\u52a8\u5b50\u4efb\u52a1<br \/>\nnew Task(() =&gt; { result[0] = &#8220;\u6211\u662f\u5b50\u4efb\u52a11&#8221;; }, TaskCreationOptions.AttachedToParent).Start();<br \/>\nnew Task(() =&gt; { result[1] = &#8220;\u6211\u662f\u5b50\u4efb\u52a12&#8221;; }, TaskCreationOptions.AttachedToParent).Start();<br \/>\nreturn result;<br \/>\n}, &#8220;\u6211\u662f\u7236\u4efb\u52a1\uff0c\u5e76\u5728\u6211\u7684\u5904\u7406\u8fc7\u7a0b\u4e2d\u521b\u5efa\u591a\u4e2a\u5b50\u4efb\u52a1\uff0c\u6240\u6709\u5b50\u4efb\u52a1\u5b8c\u6210\u4ee5\u540e\u6211\u624d\u4f1a\u7ed3\u675f\u6267\u884c&#8221;);<br \/>\n\/\/\u4efb\u52a1\u5b8c\u6210\u540e\u6267\u884c<br \/>\nparent.ContinueWith(t =&gt;<br \/>\n{<br \/>\nArray.ForEach(t.Result, r =&gt; Console.WriteLine(r));<br \/>\n});<br \/>\nparent.Start(); \/\/\u542f\u52a8\u7236\u4efb\u52a1<br \/>\nparent.Wait();\/\/\u7b49\u5f85\u4efb\u52a1\u7ed3\u675fWait\u53ea\u80fd\u7b49\u5f85\u7236\u7ebf\u7a0b\u7ed3\u675f,\u6ca1\u529e\u6cd5\u7b49\u5230\u7236\u7ebf\u7a0b\u7684ContinueWith\u7ed3\u675f<br \/>\nConsole.ReadLine();<br \/>\n}<br \/>\n2.2.4 \u52a8\u6001\u5e76\u884c<\/p>\n<p>TaskCreationOptions.AttachedToParent\u7236\u4efb\u52a1\u7b49\u5f85\u6240\u6709\u5b50\u4efb\u52a1\u5b8c\u6210\u540e\u6574\u4e2a\u4efb\u52a1\u624d\u7b97\u5b8c\u6210<\/p>\n<p>class Node<br \/>\n{<br \/>\npublic Node Left { get; set; }<br \/>\npublic Node Right { get; set; }<br \/>\npublic string Text { get; set; }<br \/>\n}<\/p>\n<p>class Program<br \/>\n{<br \/>\nstatic Node GetNode()<br \/>\n{<br \/>\nNode root = new Node<br \/>\n{<br \/>\nLeft = new Node<br \/>\n{<br \/>\nLeft = new Node{ Text = &#8220;L-L&#8221; },<br \/>\nRight = new Node{ Text = &#8220;L-R&#8221; },<br \/>\nText = &#8220;L&#8221;<br \/>\n},<br \/>\nRight = new Node<br \/>\n{<br \/>\nLeft = new Node{ Text = &#8220;R-L&#8221; },<br \/>\nRight = new Node{ Text = &#8220;R-R&#8221; },<br \/>\nText = &#8220;R&#8221;<br \/>\n},<br \/>\nText = &#8220;Root&#8221;<br \/>\n};<br \/>\nreturn root;<br \/>\n}<\/p>\n<p>static void Main(string[] args)<br \/>\n{<br \/>\nNode root = GetNode();<br \/>\nDisplayTree(root);<br \/>\n}<\/p>\n<p>static void DisplayTree(Node root)<br \/>\n{<br \/>\nvar task = Task.Factory.StartNew(() =&gt; DisplayNode(root),<br \/>\nCancellationToken.None,<br \/>\nTaskCreationOptions.None,<br \/>\nTaskScheduler.Default);<br \/>\ntask.Wait();<br \/>\n}<\/p>\n<p>static void DisplayNode(Node current)<br \/>\n{<\/p>\n<p>if (current.Left != null)<br \/>\nTask.Factory.StartNew(() =&gt; DisplayNode(current.Left),<br \/>\nCancellationToken.None,<br \/>\nTaskCreationOptions.AttachedToParent,<br \/>\nTaskScheduler.Default);<br \/>\nif (current.Right != null)<br \/>\nTask.Factory.StartNew(() =&gt; DisplayNode(current.Right),<br \/>\nCancellationToken.None,<br \/>\nTaskCreationOptions.AttachedToParent,<br \/>\nTaskScheduler.Default);<br \/>\nConsole.WriteLine(&#8220;\u5f53\u524d\u8282\u70b9\u7684\u503c\u4e3a{0};\u5904\u7406\u7684ThreadId={1}&#8221;, current.Text, Thread.CurrentThread.ManagedThreadId);<br \/>\n}<br \/>\n}<br \/>\n2.3\u3000\u53d6\u6d88\u4efb\u52a1<br \/>\nprivate static int TaskMethod(string name, int seconds, CancellationToken token)<br \/>\n{<br \/>\nConsole.WriteLine(&#8220;Task {0} \u6b63\u5728\u8fd0\u884c,\u5f53\u524d\u7ebf\u7a0bid {1}. Is thread pool thread: {2}&#8221;,<br \/>\nname, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);<br \/>\nfor (int i = 0; i &lt; seconds; i++)<br \/>\n{<br \/>\nThread.Sleep(TimeSpan.FromSeconds(1));<br \/>\nif (token.IsCancellationRequested) return -1;<br \/>\n}<br \/>\nreturn 42 * seconds;<br \/>\n}<\/p>\n<p>private static void Main(string[] args)<br \/>\n{<br \/>\nvar cts = new CancellationTokenSource();<br \/>\nvar longTask = new Task&lt;int&gt;(() =&gt; TaskMethod(&#8220;Task 1&#8221;, 10, cts.Token), cts.Token);<br \/>\nConsole.WriteLine(longTask.Status);<br \/>\ncts.Cancel();<br \/>\nConsole.WriteLine(longTask.Status);<br \/>\nConsole.WriteLine(&#8220;\u7b2c\u4e00\u4e2a\u4efb\u52a1\u5728\u6267\u884c\u524d\u5df2\u88ab\u53d6\u6d88&#8221;);<br \/>\ncts = new CancellationTokenSource();<br \/>\nlongTask = new Task&lt;int&gt;(() =&gt; TaskMethod(&#8220;Task 2&#8221;, 10, cts.Token), cts.Token);<br \/>\nlongTask.Start();<br \/>\nfor (int i = 0; i &lt; 5; i++)<br \/>\n{<br \/>\nThread.Sleep(TimeSpan.FromSeconds(0.5));<br \/>\nConsole.WriteLine(longTask.Status);<br \/>\n}<br \/>\ncts.Cancel();<br \/>\nfor (int i = 0; i &lt; 5; i++)<br \/>\n{<br \/>\nThread.Sleep(TimeSpan.FromSeconds(0.5));<br \/>\nConsole.WriteLine(longTask.Status);<br \/>\n}<\/p>\n<p>Console.WriteLine(&#8220;\u4efb\u52a1\u5df2\u5b8c\u6210,\u7ed3\u679c\u4e3a {0}.&#8221;, longTask.Result);<br \/>\n}<br \/>\n2.4\u3000\u5904\u7406\u5f02\u5e38<br \/>\n2.4.1 \u5355\u4e2a\u4efb\u52a1<\/p>\n<p>static int TaskMethod(string name, int seconds)<br \/>\n{<br \/>\nConsole.WriteLine(&#8220;Task {0} is running on a thread id {1}. Is thread pool thread: {2}&#8221;,<br \/>\nname, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);<br \/>\nThread.Sleep(TimeSpan.FromSeconds(seconds));<br \/>\nthrow new Exception(&#8220;Boom!&#8221;);<br \/>\nreturn 42 * seconds;<br \/>\n}<\/p>\n<p>static void Main(string[] args)<br \/>\n{<br \/>\ntry<br \/>\n{<br \/>\nTask&lt;int&gt; task = Task.Run(() =&gt; TaskMethod(&#8220;Task 2&#8221;, 2));<br \/>\nint result = task.GetAwaiter().GetResult();<br \/>\nConsole.WriteLine(&#8220;Result: {0}&#8221;, result);<br \/>\n}<br \/>\ncatch (Exception ex)<br \/>\n{<br \/>\nConsole.WriteLine(&#8220;Task 2 Exception caught: {0}&#8221;, ex.Message);<br \/>\n}<br \/>\nConsole.WriteLine(&#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-&#8220;);<br \/>\nConsole.ReadLine();<br \/>\n}<br \/>\n2.4.2 \u591a\u4e2a\u4efb\u52a1<\/p>\n<p>static int TaskMethod(string name, int seconds)<br \/>\n{<br \/>\nConsole.WriteLine(&#8220;Task {0} is running on a thread id {1}. Is thread pool thread: {2}&#8221;,<br \/>\nname, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);<br \/>\nThread.Sleep(TimeSpan.FromSeconds(seconds));<br \/>\nthrow new Exception(string.Format(&#8220;Task {0} Boom!&#8221;, name));<br \/>\nreturn 42 * seconds;<br \/>\n}<\/p>\n<p>public static void Main(string[] args)<br \/>\n{<br \/>\ntry<br \/>\n{<br \/>\nvar t1 = new Task&lt;int&gt;(() =&gt; TaskMethod(&#8220;Task 3&#8221;, 3));<br \/>\nvar t2 = new Task&lt;int&gt;(() =&gt; TaskMethod(&#8220;Task 4&#8221;, 2));<br \/>\nvar complexTask = Task.WhenAll(t1, t2);<br \/>\nvar exceptionHandler = complexTask.ContinueWith(t =&gt;<br \/>\nConsole.WriteLine(&#8220;Result: {0}&#8221;, t.Result),<br \/>\nTaskContinuationOptions.OnlyOnFaulted<br \/>\n);<br \/>\nt1.Start();<br \/>\nt2.Start();<br \/>\nTask.WaitAll(t1, t2);<br \/>\n}<br \/>\ncatch (AggregateException ex)<br \/>\n{<br \/>\nex.Handle(exception =&gt;<br \/>\n{<br \/>\nConsole.WriteLine(exception.Message);<br \/>\nreturn true;<br \/>\n});<br \/>\n}<br \/>\n}<br \/>\n2.4.3 async\/await\u7684\u65b9\u5f0f<\/p>\n<p>class Program<br \/>\n{<br \/>\nstatic async Task ThrowNotImplementedExceptionAsync()<br \/>\n{<br \/>\nthrow new NotImplementedException();<br \/>\n}<\/p>\n<p>static async Task ThrowInvalidOperationExceptionAsync()<br \/>\n{<br \/>\nthrow new InvalidOperationException();<br \/>\n}<\/p>\n<p>static async Task Normal()<br \/>\n{<br \/>\nawait Fun();<br \/>\n}<\/p>\n<p>static Task Fun()<br \/>\n{<br \/>\nreturn Task.Run(() =&gt;<br \/>\n{<br \/>\nfor (int i = 1; i &lt;= 10; i++)<br \/>\n{<br \/>\nConsole.WriteLine(&#8220;i={0}&#8221;, i);<br \/>\nThread.Sleep(200);<br \/>\n}<br \/>\n});<br \/>\n}<\/p>\n<p>static async Task ObserveOneExceptionAsync()<br \/>\n{<br \/>\nvar task1 = ThrowNotImplementedExceptionAsync();<br \/>\nvar task2 = ThrowInvalidOperationExceptionAsync();<br \/>\nvar task3 = Normal();<br \/>\ntry<br \/>\n{<br \/>\nTask allTasks = Task.WhenAll(task1, task2, task3); \/\/\u5f02\u6b65\u7684\u65b9\u5f0f<br \/>\nawait allTasks;<br \/>\n\/\/Task.WaitAll(task1, task2, task3); \/\/\u540c\u6b65\u7684\u65b9\u5f0f<br \/>\n}<br \/>\ncatch (NotImplementedException ex)<br \/>\n{<br \/>\nConsole.WriteLine(&#8220;task1 \u4efb\u52a1\u62a5\u9519!&#8221;);<br \/>\n}<br \/>\ncatch (InvalidOperationException ex)<br \/>\n{<br \/>\nConsole.WriteLine(&#8220;task2 \u4efb\u52a1\u62a5\u9519!&#8221;);<br \/>\n}<br \/>\ncatch (Exception ex)<br \/>\n{<br \/>\nConsole.WriteLine(&#8220;\u4efb\u52a1\u62a5\u9519!&#8221;);<br \/>\n}<br \/>\n}<\/p>\n<p>public static void Main()<br \/>\n{<br \/>\nTask task = ObserveOneExceptionAsync();<br \/>\nConsole.WriteLine(&#8220;\u4e3b\u7ebf\u7a0b\u7ee7\u7eed\u8fd0\u884c&#8230;&#8230;..&#8221;);<br \/>\ntask.Wait();<br \/>\n}<br \/>\n}<br \/>\n2.5\u3000Task.FromResult<br \/>\n\u6b64\u65b9\u6cd5\u521b\u5efa\u4e00\u4e2aTask&lt;TResult&gt;\u5bf9\u8c61\uff0c\u8be5\u5bf9\u8c61\u7684Task&lt;TResult&gt;.Result\u5c5e\u6027\u4e3aresult\uff0c\u5176Status\u5c5e\u6027\u4e3aRanToCompletion\u3002 \u5f53\u7acb\u5373\u77e5\u9053\u4efb\u52a1\u7684\u8fd4\u56de\u503c\u800c\u4e0d\u6267\u884c\u66f4\u957f\u7684\u4ee3\u7801\u8def\u5f84\u65f6\uff0c\u901a\u5e38\u4f7f\u7528\u65b9\u6cd5\u3002<\/p>\n<p>class Program<br \/>\n{<br \/>\nstatic IDictionary&lt;string, string&gt; cache = new Dictionary&lt;string, string&gt;()<br \/>\n{<br \/>\n{&#8220;0001&#8243;,&#8221;A&#8221;}, {&#8220;0002&#8243;,&#8221;B&#8221;}, {&#8220;0003&#8243;,&#8221;C&#8221;},<br \/>\n{&#8220;0004&#8243;,&#8221;D&#8221;}, {&#8220;0005&#8243;,&#8221;E&#8221;}, {&#8220;0006&#8243;,&#8221;F&#8221;}<br \/>\n};<\/p>\n<p>public static void Main()<br \/>\n{<br \/>\nTask&lt;string&gt; task = GetValueFromCache(&#8220;0006&#8221;);<br \/>\nConsole.WriteLine(&#8220;\u4e3b\u7a0b\u5e8f\u7ee7\u7eed\u6267\u884c\u3002\u3002\u3002\u3002&#8221;);<br \/>\nstring result = task.Result;<br \/>\nConsole.WriteLine(&#8220;result={0}&#8221;, result);<br \/>\n}<\/p>\n<p>private static Task&lt;string&gt; GetValueFromCache(string key)<br \/>\n{<br \/>\nConsole.WriteLine(&#8220;GetValueFromCache\u5f00\u59cb\u6267\u884c\u3002\u3002\u3002\u3002&#8221;);<br \/>\nstring result = string.Empty;<br \/>\n\/\/Task.Delay(5000);<br \/>\nThread.Sleep(5000);<br \/>\nConsole.WriteLine(&#8220;GetValueFromCache\u7ee7\u7eed\u6267\u884c\u3002\u3002\u3002\u3002&#8221;);<br \/>\nif (cache.TryGetValue(key, out result))<br \/>\n{<br \/>\nreturn Task.FromResult(result);<br \/>\n}<br \/>\nreturn Task.FromResult(&#8220;&#8221;);<br \/>\n}<br \/>\n}<br \/>\n2.6\u3000Factory.FromAsync<br \/>\n\u7b80APM\u6a21\u5f0f\uff08\u59d4\u6258\uff09\u8f6c\u6362\u4e3a\u4efb\u52a1\uff0cBeginXXX\u548cEndXXX<\/p>\n<p>2.6.1 \u5e26\u56de\u8c03\u65b9\u5f0f\u7684<\/p>\n<p>class Program<br \/>\n{<br \/>\nprivate delegate string AsynchronousTask(string threadName);<br \/>\nprivate static string Test(string threadName)<br \/>\n{<br \/>\nConsole.WriteLine(&#8220;\u5f00\u59cb&#8230;&#8221;);<br \/>\nConsole.WriteLine(&#8220;\u7ebf\u7a0b\u6c60\u662f\u7ebf\u7a0b\u5417: {0}&#8221;, Thread.CurrentThread.IsThreadPoolThread);<br \/>\nThread.Sleep(TimeSpan.FromSeconds(2));<br \/>\nThread.CurrentThread.Name = threadName;<br \/>\nreturn string.Format(&#8220;\u7ebf\u7a0b\u540d\u79f0: {0}&#8221;, Thread.CurrentThread.Name);<br \/>\n}<\/p>\n<p>private static void Callback(IAsyncResult ar)<br \/>\n{<br \/>\nConsole.WriteLine(&#8220;\u5f00\u59cb\u4e00\u4e2a\u56de\u8c03&#8230;&#8221;);<br \/>\nConsole.WriteLine(&#8220;\u4f20\u9012\u7ed9callbak\u7684\u72b6\u6001: {0}&#8221;, ar.AsyncState);<br \/>\nConsole.WriteLine(&#8220;\u7ebf\u7a0b\u6c60\u662f\u7ebf\u7a0b\u5417: {0}&#8221;, Thread.CurrentThread.IsThreadPoolThread);<br \/>\nConsole.WriteLine(&#8220;\u7ebf\u7a0b\u6c60\u5de5\u4f5c\u7ebf\u7a0bid: {0}&#8221;, Thread.CurrentThread.ManagedThreadId);<br \/>\n}<\/p>\n<p>\/\/\u6267\u884c\u7684\u6d41\u7a0b\u662f:\u5148\u6267\u884cTest&#8212;&gt;Callback&#8212;&gt;task.ContinueWith<br \/>\nstatic void Main(string[] args)<br \/>\n{<br \/>\nAsynchronousTask d = Test;<br \/>\nConsole.WriteLine(&#8220;Option 1&#8221;);<br \/>\nTask&lt;string&gt; task = Task&lt;string&gt;.Factory.FromAsync(<br \/>\nd.BeginInvoke(&#8220;AsyncTaskThread&#8221;, Callback, &#8220;\u59d4\u6258\u5f02\u6b65\u8c03\u7528&#8221;), d.EndInvoke);<br \/>\ntask.ContinueWith(t =&gt; Console.WriteLine(&#8220;\u5b8c\u6210\u56de\u8c03, \u73b0\u5728\u7ee7\u7eed! Result: {0}&#8221;, t.Result));<br \/>\nwhile (!task.IsCompleted)<br \/>\n{<br \/>\nConsole.WriteLine(task.Status);<br \/>\nThread.Sleep(TimeSpan.FromSeconds(0.5));<br \/>\n}<br \/>\nConsole.WriteLine(task.Status);<br \/>\n}<br \/>\n}<br \/>\n2.6.2 \u4e0d\u5e26\u56de\u8c03\u65b9\u5f0f\u7684<\/p>\n<p>class Program<br \/>\n{<br \/>\nprivate delegate string AsynchronousTask(string threadName);<br \/>\nprivate static string Test(string threadName)<br \/>\n{<br \/>\nConsole.WriteLine(&#8220;\u5f00\u59cb&#8230;&#8221;);<br \/>\nConsole.WriteLine(&#8220;\u7ebf\u7a0b\u6c60\u662f\u7ebf\u7a0b\u5417: {0}&#8221;, Thread.CurrentThread.IsThreadPoolThread);<br \/>\nThread.Sleep(TimeSpan.FromSeconds(2));<br \/>\nThread.CurrentThread.Name = threadName;<br \/>\nreturn string.Format(&#8220;\u7ebf\u7a0b\u540d\u79f0: {0}&#8221;, Thread.CurrentThread.Name);<br \/>\n}<\/p>\n<p>\/\/\u6267\u884c\u7684\u6d41\u7a0b\u662f:\u5148\u6267\u884cTest&#8212;&gt;task.ContinueWith<br \/>\nstatic void Main(string[] args)<br \/>\n{<br \/>\nAsynchronousTask d = Test;<br \/>\nTask&lt;string&gt; task = Task&lt;string&gt;.Factory.FromAsync(<br \/>\nd.BeginInvoke, d.EndInvoke, &#8220;AsyncTaskThread&#8221;, &#8220;\u59d4\u6258\u5f02\u6b65\u8c03\u7528&#8221;);<br \/>\ntask.ContinueWith(t =&gt; Console.WriteLine(&#8220;\u4efb\u52a1\u5b8c\u6210\uff0c\u73b0\u5728\u8fd0\u884c\u4e00\u4e2a\u5ef6\u7eed! Result: {0}&#8221;, t.Result));<br \/>\nwhile (!task.IsCompleted)<br \/>\n{<br \/>\nConsole.WriteLine(task.Status);<br \/>\nThread.Sleep(TimeSpan.FromSeconds(0.5));<br \/>\n}<br \/>\nConsole.WriteLine(task.Status);<br \/>\n}<br \/>\n}<br \/>\n2.6.3 Task\u542f\u52a8\u5e26\u53c2\u6570\u548c\u8fd4\u56de\u503c\u7684\u51fd\u6570\u4efb\u52a1<\/p>\n<p>\u65b9\u6cd51<\/p>\n<p>private int MyTest(object i)<br \/>\n{<br \/>\nthis.Invoke(new Action(() =&gt;<br \/>\n{<br \/>\npictureBox1.Visible = true;<br \/>\n}));<br \/>\nSystem.Threading.Thread.Sleep(3000);<br \/>\nMessageBox.Show(&#8220;hello:&#8221; + i);<br \/>\nthis.Invoke(new Action(() =&gt;<br \/>\n{<br \/>\npictureBox1.Visible = false;<br \/>\n}));<br \/>\nreturn 0;<br \/>\n}<\/p>\n<p>private void Call()<br \/>\n{<br \/>\n\/\/Func&lt;string, string&gt; funcOne = delegate(string s){ return &#8220;fff&#8221;; };<br \/>\nobject i = 55;<br \/>\nvar t = Task&lt;int&gt;.Factory.StartNew(new Func&lt;object, int&gt;(MyTest), i);<br \/>\n}<br \/>\n\u65b9\u6cd52<\/p>\n<p>private async Task&lt;int&gt; MyTest(object i)<br \/>\n{<br \/>\nthis.Invoke(new Action(() =&gt;<br \/>\n{<br \/>\npictureBox1.Visible = true;<br \/>\n}));<\/p>\n<p>HttpClient client = new HttpClient();<br \/>\nvar a = await client.GetAsync(&#8220;http:\/\/www.baidu.com&#8221;);<br \/>\nTask&lt;string&gt; s = a.Content.ReadAsStringAsync();<br \/>\nMessageBox.Show (s.Result);<br \/>\nthis.Invoke(new Action(() =&gt;<br \/>\n{<br \/>\npictureBox1.Visible = false;<br \/>\n}));<br \/>\nreturn 0;<br \/>\n}<\/p>\n<p>async private void Call()<br \/>\n{<br \/>\nobject i = 55;<br \/>\nvar t = Task&lt;Task&lt;int&gt;&gt;.Factory.StartNew(new Func&lt;object, Task&lt;int&gt;&gt;(MyTest), i);<br \/>\n}<br \/>\n\u65b9\u6cd53<\/p>\n<p>private async void MyTest()<br \/>\n{<br \/>\nthis.Invoke(new Action(() =&gt;<br \/>\n{<br \/>\npictureBox1.Visible = true;<br \/>\n}));<br \/>\nHttpClient client = new HttpClient();<br \/>\nvar a = await client.GetAsync(&#8220;http:\/\/www.baidu.com&#8221;);<br \/>\nTask&lt;string&gt; s = a.Content.ReadAsStringAsync();<br \/>\nMessageBox.Show (s.Result);<br \/>\nthis.Invoke(new Action(() =&gt;<br \/>\n{<br \/>\npictureBox1.Visible = false;<br \/>\n}));<br \/>\n}<\/p>\n<p>private void Call()<br \/>\n{<br \/>\nvar t = Task.Run(new Action(MyTest));<br \/>\n\/\/\u76f8\u5f53\u4e8e<br \/>\n\/\/Thread th= new Thread(new ThreadStart(MyTest));<br \/>\n\/\/th.Start();<br \/>\n}<br \/>\n2.7\u3000\u4f7f\u7528IProgress<br \/>\nIProgress&lt;in T&gt;\u53ea\u63d0\u4f9b\u4e86\u4e00\u4e2a\u65b9\u6cd5void Report(T value)\uff0c\u901a\u8fc7Report\u65b9\u6cd5\u628a\u4e00\u4e2aT\u7c7b\u578b\u7684\u503c\u62a5\u544a\u7ed9IProgress\uff0c\u7136\u540eIProgress&lt;in T&gt;\u7684\u5b9e\u73b0\u7c7bProgress&lt;in T&gt;\u7684\u6784\u9020\u51fd\u6570\u63a5\u6536\u7c7b\u578b\u4e3aAction&lt;T&gt;\u7684\u5f62\u53c2\uff0c\u901a\u8fc7\u8fd9\u4e2a\u59d4\u6258\u8ba9\u8fdb\u5ea6\u663e\u793a\u5728UI\u754c\u9762\u4e2d\u3002<\/p>\n<p>class Program<br \/>\n{<br \/>\nstatic void DoProcessing(IProgress&lt;int&gt; progress)<br \/>\n{<br \/>\nfor (int i = 0; i &lt;= 100; ++i)<br \/>\n{<br \/>\nThread.Sleep(100);<br \/>\nif (progress != null)<br \/>\n{<br \/>\nprogress.Report(i);<br \/>\n}<br \/>\n}<br \/>\n}<\/p>\n<p>static async Task Display()<br \/>\n{<br \/>\n\/\/\u5f53\u524d\u7ebf\u7a0b<br \/>\nvar progress = new Progress&lt;int&gt;(percent =&gt;<br \/>\n{<br \/>\nConsole.Clear();<br \/>\nConsole.Write(&#8220;{0}%&#8221;, percent);<br \/>\n});<br \/>\n\/\/\u7ebf\u7a0b\u6c60\u7ebf\u7a0b<br \/>\nawait Task.Run(() =&gt; DoProcessing(progress));<br \/>\nConsole.WriteLine(&#8220;&#8221;);<br \/>\nConsole.WriteLine(&#8220;\u7ed3\u675f&#8221;);<br \/>\n}<\/p>\n<p>public static void Main()<br \/>\n{<br \/>\nTask task = Display();<br \/>\ntask.Wait();<br \/>\n}<br \/>\n}<\/p>\n","protected":false},"excerpt":{"rendered":"<p>cc from &nbsp; \u5c0f\u84dd\u6ce2 \u4e8e<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[24],"tags":[121],"class_list":["post-7089","post","type-post","status-publish","format-standard","hentry","category-value_docs","tag-05-"],"_links":{"self":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/7089","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/comments?post=7089"}],"version-history":[{"count":0,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/7089\/revisions"}],"wp:attachment":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/media?parent=7089"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/categories?post=7089"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/tags?post=7089"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}