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
Düzeltme bozucu ya da bozmayan olabilir Kesintisiz
.NET 10'da varsayılan olarak etkin Hayır
Geçerli diller C# ve Visual Basic

Neden

Asenkron bir yöntem doğrudan beklerTask.

Kural açıklaması

Asenkron bir yöntem doğrudan bir Task beklediğinde, devam işlemi genellikle asenkron 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 Task.ConfigureAwait(Boolean) aramayı düşünün.

İhlalleri düzeltme

İhlalleri düzeltmek için, beklenen Task üzerinde ConfigureAwait çağrısı yapın. continueOnCapturedContext parametresi için true veya false geçirebilirsiniz.

  • Göreve ConfigureAwait(true) çağrısı yapmak, ConfigureAwait belirtmeden çağrı yapmamakla aynı davranışı sergiler. Bu yöntemi açıkça çağırarak, okuyuculara özgün eşitleme bağlamında devam etmek istediğinizi bilerek bildirebilirsiniz.

  • Görev üzerinde ConfigureAwait(false)'ı çağırarak, iş parçacığı havuzuna devam görevlerini planlayın ve böylece kullanıcı arabirimi iş parçacığında bir kilitlenmeyi önleyin. Uygulamadan bağımsız kitaplıklar için iyi bir seçenek geçiş false'dir.

Ö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 Task üzerinde ConfigureAwait çağırın.

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 projelerde tamamen gizlenmesi genellikle uygundur; aslında, bu çözümleyiciyi uygulama kodu üzerinde çalıştırmak (örneğin, WinForms veya WPF projesinde düğme tıklama olay işleyicileri), yanlış eylemlere yol açabilir.

Durumun özgün bağlama yeniden planlanması gerektiği veya böyle bir bağlam olmadığı her durumda bu uyarıyı gizleyebilirsiniz. Örneğin, bir WinForms veya WPF uygulamasındaki tıklama olay işleyicisinde kod yazarken, genel olarak bir await'den sonra devamın UI iş parçacığında çalıştırılması gerekir ve bu nedenle devamın tekrar başlatıldığı bağlama zamanlanması varsayılan bir davranıştır ve bu istenir. Başka bir örnek olarak, bir ASP.NET Core uygulamasında varsayılan olarak SynchronizationContext veya TaskScheduler bulunmaz; bu nedenle, bir ConfigureAwait davranışta gerçekten bir değişiklik yapmaz.

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.

Kod çözümleme için konfigüre et

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ç tut

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.