共用方式為


CA2008:建立工作時請務必傳遞 TaskScheduler

屬性
規則識別碼 CA2008
職稱 建立工作時請務必傳遞 TaskScheduler
類別 可靠性
修正程式是中斷或非中斷 不中斷
在 .NET 10 中預設啟用

原因

工作建立或接續作業會使用未指定 TaskScheduler 參數的方法多載。

檔案描述

下列 .NET 工作建立和接續方法具有可指定或省略 TaskScheduler 實例的多載:

務必指定明確 TaskScheduler 參數以避免預設值, Current 該參數的行為由呼叫者定義,且執行時可能有所變化。 Current 會傳回與目前在該線程上執行的任何 Task 專案相關聯的排程器。 如果沒有這類工作,則會傳 Default回 ,代表線程集區。 在某些情況下,使用 Current 可能會導致死結或UI回應性問題,當它打算在線程集區上建立工作,但會等候回到UI線程。

如需詳細資訊和詳細範例,請參閱 .NET Framework 4.5 中的 New TaskCreationOptions 和 TaskContinuationOptions。

注意

VSTHRD105 - 避免採用 TaskScheduler.Current 的方法多載是在 Microsoft.VisualStudio.Threading.Analyzers 套件中實作的類似規則。

如何修正違規

若要修正違規,請呼叫採用 並明確傳入 TaskSchedulerDefault 讓意圖清楚的方法多載Current

Example

// This code violates the rule.
var badTask = Task.Factory.StartNew(
    () =>
    {
        // ...
    }
);
badTask.ContinueWith(
    t =>
    {
        // ...
    }
);

// This code satisfies the rule.
var goodTask = Task.Factory.StartNew(
    () =>
    {
        // ...
    },
    CancellationToken.None,
    TaskCreationOptions.None,
    TaskScheduler.Default
);
goodTask.ContinueWith(
    t =>
    {
        // ...
    },
    CancellationToken.None,
    TaskContinuationOptions.None,
    TaskScheduler.Default
);

隱藏警告的時機

此警告主要適用於連結庫,其中程式代碼可能會在任意環境中執行,以及程式代碼不應該對環境做出假設,或方法的呼叫者如何叫用或等候它。 對於代表應用程式程式代碼而非連結庫程式碼的專案,可能很適合隱藏警告。

隱藏警告

如果您只想要隱藏單一違規,請將預處理器指示詞新增至原始程式檔以停用,然後重新啟用規則。

#pragma warning disable CA2008
// The code that's violating the rule is on this line.
#pragma warning restore CA2008

若要停用檔案、資料夾或項目的規則,請在組態檔none

[*.{cs,vb}]
dotnet_diagnostic.CA2008.severity = none

如需詳細資訊,請參閱 如何隱藏程式代碼分析警告

另請參閱