簡體   English   中英

Task.CompletedTask 如何與線程池一起工作?

[英]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 1Task.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后兩者非常相似,因為它們代表“我已經完成了所需的工作,現在由於某種原因我需要將一些其他代碼傳遞給Task3

3通常,我猜這里就是這種情況,當您實現接口或覆蓋Task返回的基類方法時,但您的代碼快速且同步,因此您無需async

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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