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 8'de 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 ConfigureAwaitTask. 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 ConfigureAwaitTask:

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 noneolarak 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

Ayrıca bkz.