await işlecini kullanan eşzamanlı olmayan yöntemlerdeki hata ve uyarıları düzeltin

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.
  • CS4001: Await ifadesi kullanılamaz.
  • CS4003: 'await' zaman uyumsuz bir yöntem veya lambda ifadesi içinde tanımlayıcı olarak kullanılamaz.
  • CS4005: Zaman uyumsuz yöntemlerin işaretçi türü parametreleri olamaz.
  • CS4006: zaman uyumsuz yöntemlerin parametre listesinde __arglist izin verilmez.
  • CS4007: Tür örneği 'await' veya 'yield' sınırında korunamaz.
  • CS4008: 'void' ifadesi beklenecek durumda değil.
  • CS4009: Void veya int döndüren giriş noktası eşzamansız olamaz.
  • CS4010: Zaman uyumsuz ifade temsilci türüne dönüştürülemiyor. Zaman uyumsuz bir ifade void, Task veya Task<T> döndürebilir; bunların hiçbiri türe dönüştürülemez.
  • CS4011: 'await', dönüş türünün '{1}olmasını gerektirir. GetAwaiter()' uygun 'IsCompleted', 'OnCompleted' ve 'GetResult' üyelerine sahiptir ve 'INotifyCompletion' veya 'ICriticalNotifyCompletion' uygular.
  • CS4012: Eşzamanlı olmayan yöntemlerde veya eşzamanlı olmayan lambda ifadelerinde türündeki parametreler bildirilemez.
  • 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.
  • CS4015: 'MethodImplOptions.Synchronized' zaman uyumsuz bir yönteme uygulanamaz.
  • CS4016: Bu, zaman uyumsuz bir yöntem olduğundan, dönüş ifadesi bildirilen tür yerine, "Task" benzeri bir türde olmalıdır.
  • CS4027: İfade türü gerekli üyeyi uygulamaz.
  • CS4028: 'await', türün uygun bir 'GetAwaiter' yöntemine sahip olmasını gerektirir. 'System' için bir kullanım yönergesi eksik mi?
  • CS4029: 'void' türünde bir ifade döndürülemez.
  • CS4030: Güvenlik özniteliği bir Async yöntemine uygulanamaz.
  • 'SecurityCritical' veya 'SecuritySafeCritical' özniteliğine sahip bir Arabirimde, Sınıfta veya Yapıda asenkron yöntemlere izin verilmez.
  • 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.
  • CS4034: 'await' işleci yalnızca zaman uyumsuz bir yöntem içinde kullanılabilir. Bu yöntemi 'async' değiştiricisi ile işaretlemeyi göz önünde bulundurun.
  • CS8031: Zaman uyumsuz lambda ifadesi, bir görev (task) döndüren bir temsilciye dönüştürüldüğünde, bir değer döndüremez.
  • CS8100: 'await' işleci statik betik değişkeni başlatıcısında kullanılamaz.
  • CS8177: Asenkron yöntemlerin başvuruyla kullanılan yerel değişkenleri olamaz.
  • CS8178: Bir yöntem çağrısı tarafından döndürülen bir başvuru, 'await' veya 'yield' sınırını geçerken korunamaz.
  • CS8204: Tür hedefi için AsyncMethodBuilder olarak kullanılacak tür için, Task özelliği bildirilen tür yerine hedef türü döndürmelidir.
  • CS8403: IAsyncEnumerableasyncT< döndürmek için yineleyici bloğu olan yöntem '>' olmalıdır.
  • CS8411: Zaman uyumsuz foreach deyimi, türün gerekli üye için uygun bir genel örnek veya uzantı tanımı içermemesi nedeniyle türdeki değişkenler üzerinde çalışamaz.
  • CS8892: Zaman uyumlu bir giriş noktası bulunduğundan yöntem giriş noktası olarak kullanılmaz.
  • CS8935: AsyncMethodBuilder özniteliğine, açık bir dönüş türü olmayan anonim yöntemlerde izin verilmiyor.
  • CS8940: Genel bir görev benzeri dönüş türü bekleniyordu, ancak 'AsyncMethodBuilder' özniteliğinde bulunan tür uygun değildi. İlişkisiz genel bir arity türü olmalı ve içeren türü (varsa) genel olmayan olmalıdır.
  • 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.
  • CS4034: 'await' işleci yalnızca zaman uyumsuz bir yöntem içinde kullanılabilir. Bu yöntemi 'async' değiştiricisi ile işaretlemeyi göz önünde bulundurun.
  • CS8178: Bu çağrı tarafından döndürülen bir başvuru 'await' veya 'yield' sınırında korunamaz.
  • CS8411: Türü gerekli üye için uygun bir genel örnek veya uzantı tanımı içermediğinden, zaman uyumsuz foreach deyimi tür değişkenleri üzerinde çalışamaz.
  • CS4001: İfade beklenemez.
  • CS4003: 'await' zaman uyumsuz bir yöntem veya lambda ifadesi içinde tanımlayıcı olarak kullanılamaz.
  • CS4007: Tür örneği '' veya 'awaityield' sınırında korunamaz.
  • CS4011: 'await', 'GetAwaiter()' dönüş türünün uygun 'IsCompleted', 'OnCompleted' ve 'GetResult' üyelerine sahip olmasını ve 'INotifyCompletion' veya 'ICriticalNotifyCompletion' uygulamasını gerektirir.
  • CS4027: Tür gerekli üyeyi uygulamaz.
  • CS4028: 'await', türün uygun bir 'GetAwaiter' yöntemine sahip olmasını gerektirir. 'System' için bir kullanım yönergesi eksik mi?
  • CS8100: 'await' işleci statik betik değişkeni başlatıcısında kullanılamaz.

Aşağıdaki öğeler her hatayı nasıl düzelteceklerini açıklar. await işleci ve awaiter deseni hakkında daha fazla bilgi için Async ve await ile zaman uyumsuz programlama konusuna bakın.

  • async değiştiricisini, await ifadesini içeren yöntem veya lambda ifadesine ekleyin (CS1992, CS4032, CS4033, CS4034). Derleyici, zaman uyumsuz askıya alma ve yeniden başlatmayı işleyen durum makinesini oluşturabilmesi için async değiştiricisini gerektirir. Bu hatanın üç çeşidi, doğru dönüş türü için bağlama özgü öneriler sağlar.
  • C# 5 veya daha önceki bir sürümü hedeflediğinizde (await), catch ifadeleri bloklarının dışına taşıyın. C# 6'dan başlayarak, derleyici hem await hem de catch bloklarında finally destekler. Bu hata artık C# 6 ve sonraki sürümlerde üretilmemiştir.
  • await ifadelerini lock deyim bloklarının dışına taşı (CS1996). Bir kilidi tutarken eşzamansız askıya almak, deadlock riskini artırır. Kilit, diğer kodların aynı kilidi bekleyebileceği iş parçacığı geçişleri boyunca tutulur.
  • Sorgu ifadeleriniawait, yalnızca ilk from yan tümcenin ilk koleksiyon ifadesinde veya bir join yan tümcenin koleksiyon ifadesinde (CS1995) görünecek şekilde yeniden yapılandırın. Diğer sorgu yan tümceleri, eşzamansız askıya alma desteği olmayan lambda ifadelerine dönüştürülür.
  • GetAwaiter() izleyen erişilebilir bir yöntemi (CS1986, CS4028) kullanıma sunması için beklenen ifadenin türünü değiştirin. türü, deseni doğrudan veya bir uzantı yöntemi aracılığıyla uygulayabilir. GetAwaiter yöntemi mevcutsa ancak using için bir System yönergeniz yoksa, derleyici CS1986 yerine daha özel CS4028 iletisini üretir.
  • GetAwaiter() tarafından döndürülen awaiter türünün IsCompleted, OnCompleted, ve GetResult üyelerine sahip olduğundan, INotifyCompletion veya ICriticalNotifyCompletion uyguladığından emin olun (CS4011, CS4027). İfade, await tamamlanma durumunu denetlemek, devamlılıkları kaydetmek ve sonuçları almak için bu üyelere bağlıdır.
  • Çağrılan yöntemin dönüş türünü voidTaskTask<TResult> veya olarak değiştirin; böylece sonuç beklenebilir (CS4008). void-dönüşlü bir yöntemi bekleyemezsiniz çünkü tamamlanmayı izlemek veya özel durumları yaymak için bir görev nesnesi yoktur.
  • Beklenen ifadeyi, awaiter deseni (CS4001) destekleyen bir türle değiştirin. int, string ve diğer yerleşik türler gibi türlerin bir GetAwaiter yöntemi yoktur ve doğrudan beklenemez.
  • Kullanmadan önce bir başvuru döndüren yöntem çağrısının sonucunu yerel değişkende depolayın await (CS8178). ** Zaman uyumsuz durum makinesi, referansı geçersiz kılarak farklı bir iş parçacığı veya bağlamda askıya alınıp sürdürülebileceğinden, bir yöntem tarafından döndürülen referans bir await sınırında korunamaz.
  • Uygulayın IAsyncEnumerable<T> koleksiyon türüne veya GetAsyncEnumerator ve Current üyeleriyle bir tür döndüren erişilebilir bir yöntem ekleyin (MoveNextAsync). await foreach deyimi, koleksiyon türünün zaman uyumsuz numaralandırılabilir desenini takip etmesini gerektirir.
  • Bir yöntem veya lambda ifadesi (await) içinde adlı async herhangi bir yerel değişkeni veya parametreyi yeniden adlandırın. Zaman uyumsuz bağlamlar içinde bağlamsal await bir anahtar sözcüktür ve tanımlayıcı olarak kullanılamaz.
  • İfadeyi await statik betik değişkeni başlatıcısının dışına ve bir yöntem gövdesine (CS8100) taşıyın. Statik başlatıcılar zaman uyumsuz bir bağlam dışında çalışır, bu nedenle await bu konumda kullanılamaz.
  • ref struct, await veya yield sınırında örneklerin korunmasına gerek kalmaması için kodu yeniden yapılandırın (CS4007). Zaman uyumsuz durum makinesi yığında yerel değişkenleri depolar ve ref struct türler tasarım gereği yığına bağlıdır; bunlar askıya alma noktaları arasında yığın depolamaya güvenli bir şekilde taşınamaz.

Asin yöntem imzası gereksinimleri

  • CS1983: Bu zaman uyumsuz bir yöntem olduğundan, dönüş ifadesi 'Task<T>' yerine 'T' türünde olmalıdır.
  • 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.
  • CS8935: AsyncMethodBuilder özniteliğine, açık bir dönüş türü olmayan anonim yöntemlerde izin verilmiyor.
  • CS8940: Genel bir görev benzeri dönüş türü bekleniyordu, ancak 'AsyncMethodBuilder' özniteliğinde bulunan tür uygun değildi. İlişkisiz genel bir arity türü olmalı ve içeren türü (varsa) genel olmayan olmalıdır.
  • CS8403: Yineleyici bloğu olan bir yöntemin 'async' olması ve '{1}' türünü döndürmesi gerekir.
  • CS9330: 'MethodImplAttribute.Async' yöntemlere el ile uygulanamaz. 'async' yöntemini işaretleyin.
  • CS4005: Async yöntemler işaretçi türü parametrelere sahip olamaz.
  • CS4006: zaman uyumsuz yöntemlerin parametre listesinde __arglist izin verilmez.
  • CS4010: Async lambda, temsilci türüne dönüştürülemiyor. Async lambda, void, Task veya Task<T> döndürebilir; ancak bunların hiçbiri dönüş türüne dönüştürülemez.
  • CS4012: Türündeki parametreler eşzamansız yöntemlerde veya eşzamansız lambda ifadelerinde bildirilemez.
  • CS4015: 'MethodImplOptions.Synchronized' zaman uyumsuz bir yönteme uygulanamaz.
  • CS4016: Bu yöntem zaman uyumsuz olduğundan, dönüş ifadesi tür yerine Task türünde olmalıdır.
  • CS8031: Temsilci döndüren göreve dönüştürülen zaman uyumsuz lambda ifadesi bir değer döndüremez.
  • CS8204: Türün türü için AsyncMethodBuilder olarak kullanılması için, Task özelliği bildirilen tür yerine gerekli türü döndürmelidir.

Aşağıdaki öğeler her hatayı nasıl düzelteceklerini açıklar. Zaman uyumsuz yöntem bildirimleri hakkında daha fazla bilgi için async ve Zaman Uyumsuz dönüş türlerine bakın.

  • Dönüş ifadesini zaman uyumsuz yöntemin temel alınan sonuç türüyle (CS1983, CS4016) eşleşecek şekilde değiştirin. Zaman uyumsuz bir yöntem Task<T> döndürdüğünde, return deyimi, derleyici tarafından oluşturulan T değeri otomatik olarak bir görev içinde sardığı için Task<T> değil, türünde bir değer sağlamalıdır. CS1983, yöntem Task<T> döndürdüğünde ve ifade T olduğunda görüntülenir; CS4016 ise dönüş ifadesi türünün eşleşmediği genel durumu kapsar.
  • Değiştiriciyi async , soyut yöntemler veya arabirim yöntemi bildirimleri (CS1994) gibi gövdesi olmayan yöntemlerden kaldırın. Değiştirici, derleyicinin durumu makinesi uygulamasını oluşturabilmesi için async yöntem gövdesine ihtiyaç duyar.
  • Zaman uyumsuz giriş noktasının dönüş türünü Task veya Task<TResult> (CS4009) olarak değiştirin. C# 7.1'den itibaren Main yöntemi olabilirasync, ancak geri dönüş türü Task veya Task<int> - async void olmalı ve async int geçerli giriş noktası imzaları değildir.
  • Proje hem senkron hem de asenkron bir yöntem (Main) içerdiğinde bir giriş noktasını kaldırın veya yeniden adlandırın. Derleyici senkron giriş noktasını seçer ve gözardı ettiği asenkron aday için bu uyarıyı verir.
  • özniteliğini uygulamadan [AsyncMethodBuilder] önce lambda ifadesine açık bir dönüş türü ekleyin (CS8935). Derleme zamanında özniteliğin belirli bir dönüş türüyle eşleşmesi gerektiğinden, derleyici dönüş türü tahmin edilen anonim yöntem için oluşturucu türünü belirleyemiyor.
  • Özniteliğinde [AsyncMethodBuilder] belirtilen türü, MyTaskMethodBuilder<> genel olmayan bir tür (MyTaskMethodBuilder<T>) yerine ilişkisiz genel bir arity türüyle değiştirin. Oluşturucunun, varsa, içerdiği tür de genel olmayan bir tür olmalıdır. Derleyici, oluşturucuyu herhangi bir somut görev benzeri dönüş türü için oluşturabilmesi için bu şekli gerektirir.
  • El ile [MethodImpl(MethodImplOptions.Async)] özniteliğini yöntem bildirimindeki async (CS9330) anahtar sözcüğüyle değiştirin. MethodImplOptions.Async bayrağı iç çalışma zamanı kullanımı için ayrılmıştır ve doğrudan kullanıcı koduna uygulanamaz.
  • Değiştiriciyi asyncyineleyici blokları içeren ve ya IAsyncEnumerable<T> ya da IAsyncEnumerator<T> (CS8403) döndüren yöntemlere ekleyin. async Değiştirici olmadan, derleyici yöntemini zaman uyumlu bir yineleyici olarak ele alır ve zaman uyumsuz akış durumu makinesi oluşturamaz.
  • Zaman uyumsuz yöntemlerden (CS4005) işaretçi türü parametreleri kaldırın. İşaretçiler, yürütmenin farklı bir iş parçacığında devam edebileceği uyumsuz askıya alma noktalarında güvenli bir şekilde korunamayan sabit bellek konumlarına referans verir.
  • Zaman uyumsuz yöntem parametre listelerinden __arglist kaldırın (CS4006). Değişken uzunluklu bağımsız değişken listeleri, yığın tabanlı çağrı kurallarına uyumsuz olan yığın tarafından ayrılan zaman uyumsuz durum makinesi ile uyumsuzdur.
  • ref, in, out veya ref struct gibi Span<T> türlerin parametrelerini, zaman uyumsuz yöntemlerden veya zaman uyumsuz lambda ifadelerinden kaldırın (ReadOnlySpan<T>). Bu parametre türleri yığına bağlıdır ve kümeye ayrılan zaman uyumsuz durum makinesi kapanışında güvenli bir şekilde yakalanamaz.
  • Hedef temsilci türünü async lambda'nın dönüş türüyle (CS4010) eşleşmesi için değiştirin. Zaman uyumsuz bir lambda, void, Task veya Task<TResult> döndürebilir ve derleyici bunları farklı dönüş türleri bekleyen genel temsilci türlerine dönüştüremez.
  • return ifadesini, genel olmayan Task döndüren bir temsilciye atanmış zaman uyumsuz bir lambdadan kaldırın ya da lambda'nın bir değer döndürebilmesi için temsilci türünü Func<Task<T>> olarak değiştirin (CS8031). Genel olmayan Task döndüren temsilci, sonuç döndürmeyen zaman uyumsuz işlemi temsil eder, bu nedenle bir değer döndürmek tür uyuşmazlığına yol açar.
  • Asenkron yöntemlerden [MethodImpl(MethodImplOptions.Synchronized)] özniteliğini (CS4015) kaldırın. Bu seçenek Synchronized tüm yöntem yürütmesi için bir kilit alır, ancak aynı işlevdeki zaman uyumsuz bir yöntem, farklı iş parçacıklarında askıya alınabilir ve yeniden başlatılabilir, bu da kilit semantiğini tanımsız hale getirir.
  • Özel AsyncMethodBuilder türünü düzelterek, Task özelliğinin zaman uyumsuz yöntemin bildirilen dönüş türüyle (CS8204) aynı türü döndürmesini sağlar. Derleyici, son görev nesnesini almak için oluşturucunun Task özelliğini kullanır, bu nedenle tür uyuşmazlığı durum makinesinin düzgün çalışmasını engeller.

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.
  • CS8177: Asenkron yöntemler referans ile geçirilen yereller bulunduramaz.
  • CS9123: '&' işleci, zaman uyumsuz yöntemlerdeki parametrelerde veya yerel değişkenlerde kullanılmamalıdır.
  • CS4029: 'void' türünde bir ifade döndürülemez.
  • CS4030: Güvenlik özniteliği bir Async yöntemine uygulanamaz.
  • CS4031: 'SecurityCritical' veya 'SecuritySafeCritical' özniteliğine sahip bir arabirim, sınıf veya yapı içerisinde asenkron yöntemlere izin verilmez.

Aşağıdaki öğeler her hatayı nasıl düzelteceklerini açıklar. Daha fazla bilgi için bkz: Async ve await ile zaman uyumsuz programlama ve await operatörü.

  • Add await işlemcisini, Task veya Task<TResult> döndüren her çağrıya ekleyin ya da eğer sonuçların ihmal edilmesi gerçekten isteniyorsa _ = ile sonucu açıkça atın (CS4014). await olmadan, zaman uyumsuz işlem tarafından atılan herhangi bir istisna gözden kaçar ve çağrı yöntemi, işlem tamamlanmadan yürütülmeye devam eder, bu da belirsiz sıralama ve doğruluk hatalarına neden olabilir.
  • return dönüş türü Task (genel olmayan) olan zaman uyumsuz bir yöntemden ifadeyi kaldırın veya yöntemin bir değer döndürmesi gerektiğinde dönüş türünü Task<T> (CS1997) olarak değiştirin. Task döndüren zaman uyumsuz bir yöntem içinde, derleyici görev sarmalayıcısını oluşturur - bir değer döndürmek, yöntem imzası herhangi bir sonuç vaat etmediğinden, tür uyuşmazlığı yaratır.
  • Yöntem gövdesine en az bir await ifade ekleyin veya değiştiriciyi async kaldırıp görevi doğrudan döndürün (CS1998). İfade içermeyen bir async yöntemi tamamen senkron olarak çalıştırılır ve bu da gereksiz bir durum makinesi ek yükü ekler. Yöntem kasıtlı olarak zaman uyumlu bir işlemi sarmalıyorsa, async’ı çıkarıp görevi açıkça döndürmek bu ek yükü ortadan kaldırır.
  • Lambda ifadesini, bir async türüne () atanırken Expression<Func<...>> kullanılmaması için (CS1989) yeniden yazın. İfade ağaçları, kodu derleyicinin çözümleyebileceği veya çevirebileceği veri yapıları olarak temsil eder, ancak oluşturan async karmaşık durum makinesi bir ifade ağacında yakalanamaz.
  • Olay uygulamasını değiştirerek hem arabirim bildiriminin hem de uygulayan sınıfın olayın Windows Çalışma Zamanı semantiği mi yoksa normal .NET semantiği mi (CS1991) kullandığı konusunda anlaşabilmesini sağlayın. Bu hata, bir WinRT olayının klasik bir .NET olayı olarak ya da tam tersinin uygulanamadığı Windows Çalışma Zamanı interop senaryoları için geçerlidir.
  • Zaman uyumsuz yöntemlerin içindeki parametrelere veya yerel değişkenlere referans veren ifadelerden adres alma operatörünü (&) kaldırın (CS9123). Asenkron durum makinesi, askıya alma sırasında yakalanan değişkenleri bellek yığınına yeniden konumlandırabilir ve bu da adresi aracılığıyla elde edilen tüm işaretçileri geçersiz kılar.
  • Zaman uyumsuz yöntemlerden başvuruya göre yerel değişkenleri kaldırın veya bunların bir await sınırını aşmadığından emin olun (CS8177). Zaman uyumsuz durum makinesi yığınla ayrılmış kapanışlarda yerel değişkenleri yakalar ve yığın konumlarına yapılan başvurular askıya alma noktaları arasında güvenli bir şekilde korunamaz. C# 13 ve sonraki sürümlerde, yerel değişkenler bir sınıra yayılmadıkları sürece zaman uyumsuz yöntemlerde kullanılabilir ve bu hata oluşmaz.
  • return-return yönteminin sonucunu voiddöndüren deyimini kaldırın veya çağrılan yöntemi bir değer döndürecek şekilde değiştirin (CS4029). Şunu kullanamazsınız: return SomeVoidMethod(); çünkü void, değer olarak döndürülebilecek bir tür değildir. Ya return anahtar sözcüğünü kaldırın ve yöntemi tek başına bir ifade olarak çağırın veya çağrılan yöntemin imzasını somut bir tür döndürecek şekilde değiştirin.
  • Zaman uyumsuz yöntemlerden ([SecurityCritical]) [SecuritySafeCritical] veya gibi güvenlik özniteliklerini kaldırın ya da bu özniteliklerle işaretlenmiş türlerdeki yöntemlerden async değiştiricisini kaldırın (CS4031). Kod erişimi güvenlik ek açıklamaları bildirim yöntemine uygulanır, ancak derleyici tarafından oluşturulan zaman uyumsuz durum makinesi, bu güvenlik ek açıklamalarının uygulanamaz olduğu ayrı bir bağlamda çalışır.