[英]How a task is constructed when using Invoke on a delegate?
delegate Task MyDelegate();
event MyDelegate d;
d += () => Task.Delay(100);
d += () => Task.Delay(200);
d += () => Task.Delay(300);
var t = d.Invoke();
await Task.Delay(1000);
通過Invoke
狀態調用后為:
Id = 1, Status = WaitingForActivation, Method = {null}
。
延遲之后,所以當所有任務完成后,它是:
Id = 1, Status = RanToCompletion, Method = {null}
。
這是否意味着Invoke
隱式執行Task.WhenAll
或者它的內部機制甚至有所不同?
委托合並不知道Task
或await
。 正如您所注意到的,它將執行所有這些並返回最后一個。 代表將簡單地將其他人放在地板上,只返回最后一個。
但在這種情況下, Task.Delay
不執行任何操作,它只是返回一個你必須等待的“承諾”。 如果您不await
它,則不會發生延遲。
最后的結果你也會掉在地板上,因為你沒有await t
。 唯一實際工作的Delay
是最后的await Task.Delay(1000);
delegate Task MyDelegate();
event MyDelegate d;
d += () => Task.Delay(100); // Just returns a Task when executed, does NOT block
d += () => Task.Delay(200);
d += () => Task.Delay(300);
// Nothing has happened yet!!
var t = d.Invoke();
// All delegates are executed synchronously, but only the final result is returned.
// Each delegate returned a Task but did not block for the delay amount.
// Result is also dropped so no delay happens at all.
await Task.Delay(1000);
// Final real delay of 1000
如果您將最后一行更改為await t;
相反,您會等待 300 毫秒,而不是總共 600 毫秒。
您可以在這個 do.netfiddle中看到所有這些操作。
在對整數進行快速實驗后,它似乎返回了最后一個委托結果:
delegate int MyDelegate();
event MyDelegate d;
d += () => 3;
d += () => 1;
d += () => 2;
var t = d.Invoke(); // t = 2
所以在最初的任務情況下,返回最后添加的代表的任務。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.