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.
| Ö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