Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
| 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:
- System.Threading.Tasks.TaskFactory.StartNew yöntemleri
- System.Threading.Tasks.Task.ContinueWith yöntemleri
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.