[英]How does Task.CompletedTask work with thread pool?
我是 C# 異步編程的新手,只是一個關於任務和線程池之間關系的問題。
我的理解是:當我們創建一個Task
,這個Task
在線程池中排隊,線程池會調度一個工作線程來運行這個Task
我看到了下面的代碼:
public Task InputOutputC() {
return Task.CompletedTask;
}
我不太明白,似乎回報Task
已經完成,這意味着一個工人線程已經運行這個Task
,但含義Task
就是讓線程池中的工作線程來運行它,如果它已經完成了,再次將其返回到線程池並再次執行有什么意義?
Task的意思就是讓線程池中的一個工作線程去運行它,
在線程池上運行代碼是Task
表現自己的一種方式。
創建Task
的其他方法是編寫async
方法並使用Task.CompletedTask
1或Task.FromResult<TResult>
2 。
僅僅因為Task.Run
導致代碼在線程池上運行並不意味着Task
這些其他用途也必須涉及線程池。
對於Task.CompletedTask
,尤其是“我已經完成了所需的工作,但我想將它作為Task
呈現給其他代碼。沒有額外的代碼在任何地方運行。
我們可以在參考源中看到這個屬性只是返回任務:
/// <summary>A task that's already been completed successfully.</summary>
private static Task s_completedTask;
/// <summary>Gets a task that's already been completed successfully.</summary>
/// <remarks>May not always return the same instance.</remarks>
public static Task CompletedTask
{
get
{
var completedTask = s_completedTask;
if (completedTask == null)
s_completedTask = completedTask = new Task(false, (TaskCreationOptions)InternalTaskOptions.DoNotDispose, default(CancellationToken)); // benign initialization ----
return completedTask;
}
}
1不過,正如后面的參考源所示,我們通常甚至不會在這里創建新Task
,只是重用現有Task
。 但是團隊顯然決定放棄屬性的線程安全初始化,以支持記錄他們不會保證總是返回相同的Task
。
2后兩者非常相似,因為它們代表“我已經完成了所需的工作,現在由於某種原因我需要將一些其他代碼傳遞給Task
” 3 。
3通常,我猜這里就是這種情況,當您實現接口或覆蓋Task
返回的基類方法時,但您的代碼快速且同步,因此您無需async
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.