CA2007: Doğrudan görev beklemeyin
Özellik | Değer |
---|---|
Kural Kimliği | CA2007 |
Başlık | Doğrudan bir Görevi beklemeyin |
Kategori | Güvenilirlik |
Hataya neden olan veya bozulmayan düzeltme | Hataya neden olmayan |
.NET 9'da varsayılan olarak etkin | Hayır |
Neden
Zaman uyumsuz bir yöntem doğrudan bir Task bekler.
Kural açıklaması
Zaman uyumsuz bir yöntem doğrudan bir Task yöntem beklediğinde, devamlılık genellikle zaman uyumsuz bağlama bağlı olarak görevi oluşturan iş parçacığında gerçekleşir. Bu davranış performans açısından maliyetli olabilir ve kullanıcı arabirimi iş parçacığında kilitlenmeye neden olabilir. Devam etme niyetinizi haber vermek için aramayı Task.ConfigureAwait(Boolean) göz önünde bulundurun.
İhlalleri düzeltme
İhlalleri düzeltmek için, beklenen öğesini çağırın ConfigureAwait Task. parametresi için continueOnCapturedContext
veya false
geçirebilirsiniztrue
.
Görev üzerinde çağırma
ConfigureAwait(true)
, açıkça çağrılmamasıyla ConfigureAwaitaynı davranışa sahiptir. Bu yöntemi açıkça çağırarak, okuyuculara özgün eşitleme bağlamında devam etmek istediğinizi bilerek bildirebilirsiniz.İş parçacığı havuzuna devamlılık zamanlamak için görev üzerinde çağrısı
ConfigureAwait(false)
yaparak kullanıcı arabirimi iş parçacığında kilitlenmeyi önle.false
Geçiş, uygulamadan bağımsız kitaplıklar için iyi bir seçenektir.
Örnek
Aşağıdaki kod parçacığı uyarıyı oluşturur:
public async Task Execute()
{
Task task = null;
await task;
}
İhlali düzeltmek için beklenen öğesini çağırın ConfigureAwait Task:
public async Task Execute()
{
Task task = null;
await task.ConfigureAwait(false);
}
Uyarıların ne zaman bastırılması gerekiyor?
Bu uyarı, 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. Uyarının kitaplık kodu yerine uygulama kodunu temsil eden projeler için tamamen gizlenmek genellikle uygundur; aslında, bu çözümleyiciyi uygulama kodunda çalıştırmak (örneğin, WinForms veya WPF projesinde düğme tıklama olay işleyicileri) yanlış eylemlerin yapılmasına neden olabilir.
Devamın özgün bağlama geri zamanlanması gereken veya böyle bir bağlamın olmadığı her durumda bu uyarıyı gizleyebilirsiniz. Örneğin, bir düğmede kod yazarken WinForms veya WPF uygulamasında olay işleyicisine tıklandığında, genel olarak bir await'den devam etme ui iş parçacığında çalıştırılmalıdır ve bu nedenle devamı kaynak bağlama geri zamanlamanın varsayılan davranışı tercih edilir. Başka bir örnek olarak, bir ASP.NET Core uygulamasında kod yazarken varsayılan olarak veya TaskScheduleryokturSynchronizationContext. Bu nedenle, herhangi bir ConfigureAwait
davranışı değiştirmez.
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 CA2007
// The code that's violating the rule is on this line.
#pragma warning restore CA2007
Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini none
olarak ayarlayın.
[*.{cs,vb}]
dotnet_diagnostic.CA2007.severity = none
Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.
Çözümlemek için kod yapılandırma
Bu kuralın kod tabanınızın hangi bölümlerinde çalıştırılacaklarını yapılandırmak için aşağıdaki seçenekleri kullanın.
Bu seçeneklerin tümünü yalnızca bu kural, geçerli olduğu tüm kurallar veya bu kategorideki (Güvenilirlik) tüm kurallar için yapılandırabilirsiniz. Daha fazla bilgi için bkz . Kod kalitesi kuralı yapılandırma seçenekleri.
Zaman uyumsuz void yöntemlerini hariç tutma
Bu kuraldan değer döndürmeyen zaman uyumsuz yöntemleri dışlamak isteyip istemediğinizi yapılandırabilirsiniz. Bu tür yöntemleri dışlamak için projenizdeki bir .editorconfig dosyasına aşağıdaki anahtar-değer çiftini ekleyin:
# Package version 2.9.0 and later
dotnet_code_quality.CA2007.exclude_async_void_methods = true
# Package version 2.6.3 and earlier
dotnet_code_quality.CA2007.skip_async_void_methods = true
Çıkış türü
Bu kuralın uygulanacağı çıkış derleme türlerini de yapılandırabilirsiniz. Örneğin, bu kuralı yalnızca konsol uygulaması veya dinamik olarak bağlı bir kitaplık (ui uygulaması değil) oluşturan koda uygulamak için projenizdeki bir .editorconfig dosyasına aşağıdaki anahtar-değer çiftini ekleyin:
dotnet_code_quality.CA2007.output_kind = ConsoleApplication, DynamicallyLinkedLibrary