簡體   English   中英

在委托上使用 Invoke 時如何構建任務?

[英]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或者它的內部機制甚至有所不同?

委托合並不知道Taskawait 正如您所注意到的,它將執行所有這些並返回最后一個。 代表將簡單地將其他人放在地板上,只返回最后一個。

但在這種情況下, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM