Aracılığıyla paylaş


Async yöntemlerdeki hataları ve uyarıları await işlecini kullanarak çözün

Bu makale aşağıdaki derleyici hatalarını kapsar:

  • CS1983: Bu zaman uyumsuz bir yöntem olduğundan, dönüş ifadesi 'T' yerine 'Task<T>' türünde olmalıdır.
  • CS1985: Catch bloğunda bekleyemezsiniz.
  • CS1986: 'await', türün uygun bir 'GetAwaiter' yöntemine sahip olmasını gerektirir.
  • CS1989: Zaman uyumsuz lambda ifadeleri ifade ağaçlarına dönüştürülemez.
  • CS1991: 'Type' bir Windows Çalışma Zamanı olayı ve 'event' normal bir .NET olayı olduğundan 'event' uygulayamıyor.
  • CS1992: 'await' işleci yalnızca 'async' değiştiricisi ile işaretlenmiş bir yöntem veya lambda ifadesi içinde bulunduğunda kullanılabilir.
  • CS1994: 'async' değiştiricisi yalnızca gövdesi olan yöntemlerde kullanılabilir.
  • CS1995: 'await' işleci, yalnızca bir sorgu ifadesinin başlangıçtaki 'from' yan tümcesinin ilk koleksiyon ifadesi içinde ya da 'join' yan tümcesinin koleksiyon ifadesi içinde kullanılabilir.
  • CS1996: Kilit deyimi gövdesinde bekleme ifadesi kullanılamaz.
  • CS1997: İşlev bir değer döndüren zaman uyumsuz bir yöntem olduğundan, dönüş anahtar sözcüğünü nesne ifadesi takip etmemelidir.
  • CS1998: Bu zaman uyumsuz yöntemde 'await' işleçleri eksiktir ve zaman uyumlu olarak çalıştırılır. Engelleyici olmayan API çağrılarını beklemek için 'await' işlecini veya arka plan iş parçacığında CPU'ya bağlı çalışma yapmak için 'await Task.Run(...)' kullanmayı göz önünde bulundurun.
  • CS4008: 'void' ifadesi beklenecek durumda değil.
  • CS4009: Void veya int döndüren giriş noktası eşzamansız olamaz.
  • CS4014: Bu çağrı beklenmediği için, çağrı tamamlanmadan önce geçerli yöntemin yürütülmesi devam eder. çağrının await sonucuna işlecini uygulamayı göz önünde bulundurun.
  • CS4032: 'await' işleci yalnızca zaman uyumsuz bir yöntem içinde kullanılabilir. Bu yöntemi 'async' değiştiricisi ile işaretlemeyi ve dönüş türünü 'Task<T>' olarak değiştirmeyi göz önünde bulundurun.
  • CS4033: 'await' işleci yalnızca zaman uyumsuz bir yöntem içinde kullanılabilir. Bu yöntemi 'async' değiştiricisi ile işaretlemeyi ve dönüş türünü 'Task' olarak değiştirmeyi göz önünde bulundurun.
  • CS8892: Zaman uyumlu bir giriş noktası bulunduğundan yöntem giriş noktası olarak kullanılmaz.
  • CS9123: '&' işleci, zaman uyumsuz yöntemlerdeki parametrelerde veya yerel değişkenlerde kullanılmamalıdır.
  • CS9330: 'MethodImplAttribute.Async' yöntemlere el ile uygulanamaz. 'async' yöntemini işaretleyin.

İfade gereksinimlerini bekle

  • CS1985: Catch yan tümcesinde await kullanılamaz.
  • CS1986: 'await', türün uygun bir 'GetAwaiter' yöntemine sahip olmasını gerektirir.
  • CS1992: 'await' işleci yalnızca 'async' değiştiricisi ile işaretlenmiş bir yöntem veya lambda ifadesi içinde bulunduğunda kullanılabilir.
  • CS1995: 'await' işleci yalnızca bir sorgu ifadesinde, ilk 'from' yan tümcesinin ilk koleksiyon ifadesi içinde veya bir 'join' yan tümcesinin koleksiyon ifadesi içinde kullanılabilir.
  • CS1996: lock ifadesinin gövdesinde await ifadesi kullanılamaz.
  • CS4008: 'void' beklenemiyor.
  • CS4032: 'await' işleci yalnızca zaman uyumsuz bir yöntem içinde kullanılabilir. Bu yöntemi 'async' değiştiricisi ile işaretlemeyi ve dönüş türünü 'Task<T>' olarak değiştirmeyi göz önünde bulundurun.
  • CS4033: 'await' işleci yalnızca zaman uyumsuz bir yöntem içinde kullanılabilir. Bu yöntemi 'async' değiştiricisi ile işaretlemeyi ve dönüş türünü 'Task' olarak değiştirmeyi göz önünde bulundurun.

işlecini await doğru kullanmak için bu kuralları izleyin. Daha fazla bilgi için bkz. Async ve await ile zaman uyumsuz programlama.

  • Catch yan tümcelerinde await kullanmayın (CS1985). Deneme bloklarında ve son bloklarda (C# 6 ve sonraki sürümlerde) kullanabilirsiniz await ancak catch blokları özel durum işleme ve denetim akışı ile özel zorluklar sunar.
  • Kullanmayın await deyimi bloklarının içinde lock. Derleyici, kilitlenmelere eğilimli kod yaymamak için bunu desteklemez.
  • Yalnızca belirli konumlarda await (CS1995) kullanın: ilk from tümcenin koleksiyon ifadesinde veya bir join yan tümcesinin koleksiyon ifadesinde.
  • Yöntemleri veya lambda ifadelerini kullanmadan önce async değiştiriciyle işaretleyin (CS1992, CS4032, CS4033).
  • Beklenen türler için bir awaiter türü döndüren erişilebilir durumda bir GetAwaiter yöntemi olduğundan emin olun (CS1986).
  • await, void türündeki ifadelere uygulanmamalıdır (CS4008).
  • Değer döndürmeyen yöntemler için veya Task değer döndüren yöntemler için dönüş türünü Task<T> olarak değiştirin.

Asin yöntem imzası gereksinimleri

  • CS1983: Bu, zaman uyumsuz bir yöntem olduğundan, dönüş ifadesi 'Task<T>' türünde olmalı, 'T' yerine.
  • CS1994: 'async' değiştiricisi yalnızca gövdesi olan yöntemlerde kullanılabilir.
  • CS4009: Void veya int döndüren giriş noktası asenkron olamaz.
  • CS8892: Zaman uyumlu bir giriş noktası bulunduğundan yöntem giriş noktası olarak kullanılmaz.
  • CS9330: 'MethodImplAttribute.Async' yöntemlere el ile uygulanamaz. 'async' yöntemini işaretleyin.

Asenkron yöntemleri doğru şekilde tanımlamak için bu imza gereksinimlerini izleyin. Daha fazla bilgi için bkz. Asenkron ana dönüş değerleri.

  • Geçerli türlerden birini döndürür: void, Task, Task<T>, , görev benzeri bir tür, IAsyncEnumerable<T>veya IAsyncEnumerator<T> (CS1983).
  • Değiştiriciyi async yalnızca gövdeli yöntemlerde kullanın (CS1994). Arabirimlerdeki async veya sınıflardaki soyut yöntemlerdeki değiştiriciyi kaldırın.
  • Giriş noktasında async kullanmak için C# 7.1 veya daha yeni bir sürüme güncelleyin Main veya async hatası almamak için daha eski sürümlerde giriş noktası için kullanmaktan kaçının.
  • Hem senkron hem de asenkron giriş noktalarınız (CS8892) varsa, senkron giriş noktalarını kaldırın.
  • MethodImplAttribute.Async anahtar sözcüğünü el ile uygulamak async yerine kullanın (CS9330).

Asenkron uygulamalar

  • CS1989: Zaman uyumsuz lambda ifadeleri ifade ağaçlarına dönüştürülemez.
  • CS1991: 'Type', bir Windows Çalışma Zamanı olayı olup 'event' ise normal bir .NET olayı olduğundan, 'event'i uygulayamaz.
  • CS1997: İşlev bir değer döndüren zaman uyumsuz bir yöntem olduğundan, dönüş anahtar sözcüğünü nesne ifadesi takip etmemelidir.
  • CS1998: Bu zaman uyumsuz yöntemde 'await' işleçleri eksiktir ve zaman uyumlu olarak çalıştırılır. Engelleyici olmayan API çağrılarını beklemek için 'await' işlecini veya arka plan iş parçacığında CPU'ya bağlı çalışma yapmak için 'await Task.Run(...)' kullanmayı göz önünde bulundurun.
  • CS4014: Bu çağrı beklenmediği için, çağrı tamamlanmadan önce geçerli yöntemin yürütülmesi devam eder. çağrının await sonucuna işlecini uygulamayı göz önünde bulundurun.
  • CS9123: '&' işleci, zaman uyumsuz yöntemlerdeki parametrelerde veya yerel değişkenlerde kullanılmamalıdır.

Eşzamansız kodu doğru yazmak ve yaygın tuzaklardan kaçınmak için bu en iyi uygulamalara uyun. Daha fazla bilgi için bkz. Async ve await ile zaman uyumsuz programlama.

  • veya (Task) döndüren Task<TResult> zaman uyumsuz yöntemlere çağrıları her zaman bekleyin. Beklenmeyen çağrılar, kayıp istisnalara ve beklenmeyen davranışlara yol açabilir.
  • Task (genel olmayan) döndüren zaman uyumsuz yöntemlerden değer döndürmeyin; bunun yerine Task<T> kullanın (CS1997).
  • Zaman uyumsuz yöntemlere en az bir await işleç ekleyin ya da async modifikasyonunu (CS1998) kaldırın.
  • Metot return döndürecekse Task deyimini kaldırın (CS1997, CS1998).
  • Bir değer döndürmek için Task<T> yöntemin dönüş türünü olarak değiştirin (CS1997, CS1998).
  • Async durum makinesine gerek yoksa async değiştiricisini kaldırın ve görevi doğrudan döndürün (CS1997, CS1998).
  • İfade ağaçlarında asenkron yöntemler kullanmayın (CS1989). İfade ağaçları kodu veri olarak temsil eder ve zaman uyumsuz yöntemlerin gerektirdiği karmaşık durum makine dönüştürmelerini desteklemez.
  • Arayüzde veya WinRT olayında erişimci ekleme veya kaldırma işlemini asenkron (CS1991) olarak işaretlemeyin. Bu, Windows Çalışma Zamanı birlikte çalışabilirliği için platforma özgü bir kısıtlamadır.
  • Zaman uyumsuz yöntemler içindeki ifadelerde adres işlecini (&) kullanmaktan kaçının (CS9123). Hedef, askıya alma sırasında bellekte yeniden konumlandırılabilir ve işaretçi geçersiz hale gelebilir.