3 回答

TA貢獻1776條經驗 獲得超12個贊
不能使用ABORT/ThreadAbortedException,您應該在定期測試“業務代碼”中支持取消事件 token.IsCancellationRequested
標志(也避免長連接或無時間連接,例如到db,否則您將永遠沒有機會測試此標志)。出于類似的原因 Thread.Sleep(delay)
調用應替換為 Task.Delay(delay, token)
打電話。 沒有線 Suspend
和 Resume
方法具有任務的功能。 不能重用任務實例也一樣。 但是你得到了兩個新工具: a) 延續// continuation with ContinueWhenAll - execute the delegate, when ALL// tasks[] had been finished; other option is ContinueWhenAnyTask.Factory.ContinueWhenAll( tasks, () => { int answer = tasks[0].Result + tasks[1].Result; Console.WriteLine("The answer is {0}", answer); });
b) 嵌套/子任務//StartNew - starts task immediately, parent ends whith childvar parent = Task.Factory.StartNew(() => { var child = Task.Factory.StartNew(() => { //... }); }, TaskCreationOptions.AttachedToParent);
因此,系統線程對任務是完全隱藏的,但在具體的系統線程中仍然執行任務的代碼。 系統線程是用于任務的資源。當然,在任務并行執行的遮罩下仍然存在線程池。線程如何執行新任務可能有不同的策略。另一個共享資源 任務調度器關心它。一些問題 任務調度器解決1)喜歡在同一個線程中執行任務及其計算,以最小化切換成本。 內聯執行2)更喜歡按已啟動的順序執行任務。 公平3)根據“任務活動的先驗知識”,在非活動線程之間更有效地分配任務。 偷工..重要:一般來說,“異步”與“并行”不一樣。使用TaskScheduler選項,您可以在一個線程中同步執行異步任務。為了表示并行代碼執行,可以使用更高的抽象(比任務): Parallel.ForEach
,PLINQ
,Dataflow
.任務與C#異步/等待特性集成 承諾模型,例如那里 requestButton.Clicked += async (o, e) => ProcessResponce(await client.RequestAsync(e.ResourceName));
執行 client.RequestAsync
不會阻止UI線程。重要:引擎蓋下 Clicked
委托調用是絕對正常的(所有線程都由編譯器完成)。
添加回答
舉報