如果我們想要創建基於Task
的TaskCompletionSource<T>
,並且沒有Result
,我們仍然需要提供T
並設置一個虛擬值。就像這樣:如果實際不需要結果,則使用TaskCompletionSource的泛型類型參數
Task SomethingAsync() {
var tcs = new TaskCompletionSource<?>();
tcs.SetResult(default(?)); //Can happen later as well, this is for demo purposes.
return tcs.Task;
}
什麼是從性能的角度使用T
最好的類型?
似乎很難僅從運行微基準來回答這個問題。我想,答案取決於應用程序的其餘部分。例如,如果我們使用TaskCompletionSource<bool>
這會導致JIT生成專用代碼並導致內存使用量。但是,如果應用程序已經使用基於布爾的任務,它不會增加內存使用量。如果我們使用TaskCompletionSource<object>
,我們可能會爲每個任務使用更多內存(或不依賴於運行時)。
這就是爲什麼我認爲基準本身不能回答這個問題,它也必須通過推理來回答。
好主意。我想知道由於對象佈局的方式,byte,bool和VoidResult是否保存任何字節。對象在64位上對齊8字節(我認爲)。此外,這會強制每個組件的一組新的jitted代碼執行此操作。 – boot4life
@ boot4life很難回答。 'TaskCompletionSource'有單個字段(存儲'Task '),並且在x86上填充4個字節的RAM。任何額外的有效載荷都會將保留空間推送到下一個4字節對齊。但我真的不知道如何處理像'VoidResult'這樣的0字節結構。如果正確完成(這可能是),那麼這意味着系統可以在單個4字節空間中存儲TaskCompletionSource (不包括CLR特定標頭),而TaskCompletionSource 和TaskCompletionSource
TaskCompletionSource在任何情況下都不會受到影響,但任務的大小爲。在4.6中,我在派生類中看到一個'T result'字段。所以理想情況下派生的部分最終會被清空。 –
boot4life