Aracılığıyla paylaş


CA2008: Bir TaskScheduler parametresi geçirmeden görev oluşturmayın

Mülk Değer
Kural Kimliği CA2008 (İngilizce)
Başlık TaskScheduler kullanmadan görev oluşturmayın
Kategori Güvenilirlik
Düzeltme sorun çıkarıyor veya çıkarmıyor Kırılmaz
.NET 10'da varsayılan olarak etkin Hayır

Neden

Görev oluşturma veya devam etme işlemi, parametre belirtmeyen TaskScheduler bir yöntem aşırı yüklemesi kullanır.

Kural açıklaması

Aşağıdaki .NET görev oluşturma ve devamlılık yöntemleri, bir TaskScheduler örneğin belirtilmesine veya atılmasına izin veren aşırı yüklemelere sahiptir:

Davranışı çağıran tarafından tanımlanan ve çalışma zamanında farklılık gösterebilen varsayılan TaskScheduler değerden kaçınmak için her zaman açık Current bir bağımsız değişken belirtin. Current , o iş parçacığında çalışmakta olan öğeyle Task ilişkilendirilmiş zamanlayıcıyı döndürür. Böyle bir görev yoksa, iş parçacığı havuzunu temsil eden Default değerini döndürür. kullanmak Current , iş parçacığı havuzunda görevi oluşturmak için tasarlandığı ancak bunun yerine kullanıcı arabirimi iş parçacığına geri dönmek için beklediği bazı durumlarda kilitlenmelere veya kullanıcı arabirimi yanıt verme sorunlarına yol açabilir.

Daha fazla bilgi ve ayrıntılı örnekler için Yeni TaskCreationOptions ve TaskContinuationOptions .NET Framework 4.5'te bkz.

Not

VSTHRD105 - TaskScheduler.Current öğesinin Microsoft.VisualStudio.Threading.Analyzers paketinde uygulanan benzer bir kural olduğunu varsayarken yöntem aşırı yüklemelerinden kaçının.

İhlalleri düzeltme

İhlalleri düzeltmek için, TaskScheduler alan ve amacı netleştirmek için açıkça Default veya Current değerlerini geçerek iletebileceğiniz yöntem aşırı yüklemesini çağırın.

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
);

Uyarıların ne zaman bastırılması gerekiyor?

Bu uyarı öncelikli olarak, kodun rastgele ortamlarda yürütülebileceği ve kodun ortam veya yöntemi çağıranın onu nasıl çağırdığı veya beklediği hakkında varsayımlarda bulunmaması gereken kitaplıklara yöneliktir. Kitaplık kodu yerine uygulama kodunu temsil eden projeler için uyarıyı göstermemek uygun olabilir.

Uyarıyı gizleme

Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.

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

Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini noneolarak ayarlayın.

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

Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.

Ayrıca bkz.