Mengatasi kesalahan dan peringatan dalam metode asinkron yang menggunakan operator tunggu

Artikel ini membahas kesalahan pengkompilasi berikut:

  • CS1983: Karena ini adalah metode asinkron, ekspresi pengembalian harus berjenis 'T' daripada 'Task<T>'.
  • CS1985: Tidak dapat menggunakan 'await' dalam klausa catch.
  • CS1986: 'await' mengharuskan jenis memiliki metode 'GetAwaiter'yang cocok.
  • CS1989: Ekspresi lambda asinkron tidak dapat dikonversi ke pohon ekspresi.
  • CS1991: 'Type' tidak dapat menerapkan 'event' karena merupakan peristiwa Windows Runtime dan 'event' adalah peristiwa .NET biasa.
  • CS1992: Operator 'await' hanya dapat digunakan saat dimuat dalam metode atau ekspresi lambda yang ditandai dengan pengubah 'asinkron'.
  • CS1994: Pengubah 'async' hanya dapat digunakan dalam metode yang memiliki tubuh.
  • CS1995: Operator 'await' hanya dapat digunakan dalam ekspresi kueri dalam ekspresi koleksi pertama dari klausa 'from' awal atau dalam ekspresi koleksi klausa ''join.
  • CS1996: Tidak dapat menunggu dalam isi pernyataan kunci.
  • CS1997: Karena fungsi adalah metode asinkron yang mengembalikan nilai, kata kunci pengembalian tidak boleh diikuti oleh ekspresi objek.
  • CS1998: Metode asinkron ini tidak memiliki operator 'await' dan akan berjalan secara sinkron. Pertimbangkan untuk menggunakan operator 'await' untuk menunggu panggilan API non-pemblokiran, atau 'await Task.Run(...)' untuk melakukan pekerjaan terikat CPU pada utas latar belakang.
  • CS4001: Tidak dapat menunggu ekspresi.
  • CS4003: 'await' tidak dapat digunakan sebagai pengidentifikasi dalam metode asinkron atau ekspresi lambda.
  • CS4005: Metode asinkron tidak dapat memiliki parameter jenis pointer.
  • CS4006: __arglist tidak diizinkan dalam daftar parameter metode asinkron.
  • CS4007: Instans dari jenis ini tidak dapat dipertahankan di seluruh batasan 'await' atau 'yield'.
  • CS4008: Tidak dapat menunggu 'void'.
  • CS4009: Titik masuk yang mengembalikan void atau int tidak dapat asinkron.
  • CS4010: Tidak dapat mengonversi ekspresi asinkron ke tipe delegasi. Ekspresi asinkron mungkin mengembalikan void, Task, atau Task<T>, yang semuanya tidak dapat dikonversi ke tipe apapun.
  • CS4011: 'await' mengharuskan jenis pengembalian '{1}. GetAwaiter()' memiliki anggota 'IsCompleted', 'OnCompleted', dan 'GetResult' yang cocok, dan menerapkan 'INotifyCompletion' atau 'ICriticalNotifyCompletion'.
  • CS4012: Parameter jenis tidak dapat dideklarasikan dalam metode asinkron atau ekspresi lambda asinkron.
  • CS4014: Karena panggilan ini tidak ditunggu, eksekusi metode saat ini berlanjut sebelum panggilan selesai. Pertimbangkan untuk menerapkan await operator ke hasil panggilan.
  • CS4015: 'MethodImplOptions.Synchronized' tidak dapat diterapkan ke metode asinkron.
  • CS4016: Karena ini adalah metode asinkron, ekspresi pengembalian harus berjenis tugas seperti jenis daripada jenis yang dideklarasikan.
  • CS4027: Jenis ekspresi belum mengimplementasikan anggota yang diharuskan.
  • CS4028: 'await' mengharuskan tipe memiliki metode 'GetAwaiter' yang sesuai. Apakah Anda melewatkan direktif penggunaan untuk 'System'?
  • CS4029: Tidak dapat mengembalikan ekspresi jenis 'void'.
  • CS4030: Atribut keamanan tidak dapat diterapkan ke metode Asinkron.
  • CS4031: Metode asinkron tidak diizinkan dalam Antarmuka, Kelas, atau Struktur yang memiliki atribut 'SecurityCritical' atau 'SecuritySafeCritical'.
  • CS4032: Operator 'await' hanya dapat digunakan dalam metode asinkron. Pertimbangkan untuk menandai metode ini dengan pengubah 'asinkron' dan mengubah jenis pengembaliannya menjadi 'Task<T>'.
  • CS4033: Operator 'await' hanya dapat digunakan dalam metode asinkron. Pertimbangkan untuk menandai metode ini dengan pengubah 'async' dan mengubah jenis pengembaliannya menjadi 'Task'.
  • CS4034: Operator 'await' hanya dapat digunakan dalam metode asinkron. Pertimbangkan untuk menandai metode ini dengan pengubah 'asinkron'.
  • CS8031: Ekspresi lambda asinkron yang dikonversi ke delegasi yang mengembalikan tugas tidak dapat mengembalikan nilai.
  • CS8100: Operator 'await' tidak dapat digunakan dalam penginisialisasi variabel skrip statis.
  • CS8177: Metode asinkron tidak dapat memiliki variabel lokal by-reference.
  • CS8178: Referensi yang dikembalikan oleh panggilan ke metode tidak dapat dipertahankan di seluruh batas 'await' atau ''yield.
  • CS8204: Agar tipe digunakan sebagai AsyncMethodBuilder untuk tipe target, properti Task-nya harus mengembalikan tipe target alih-alih tipe yang dideklarasikan.
  • CS8403: Metode dengan blok iterator harus 'async' untuk mengembalikan IAsyncEnumerable<T>.
  • CS8411: Pernyataan foreach asinkron tidak dapat beroperasi pada variabel jenis karena jenis tidak berisi instans publik atau definisi ekstensi yang sesuai untuk anggota yang diperlukan.
  • CS8892: Metode tidak akan digunakan sebagai titik masuk karena titik masuk sinkron ditemukan.
  • CS8935: Atribut AsyncMethodBuilder tidak diizinkan pada metode anonim tanpa jenis pengembalian eksplisit.
  • CS8940: Jenis pengembalian seperti tugas umum diharapkan, tetapi jenis yang ditemukan dalam atribut 'AsyncMethodBuilder' tidak cocok. Ini harus merupakan jenis aritas generik yang tidak terikat, dan jenis yang berisi (jika ada) harus non-generik.
  • CS9123: Operator '&' tidak boleh digunakan pada parameter atau variabel lokal dalam metode asinkron.
  • CS9330: 'MethodImplAttribute.Async' tidak dapat diterapkan secara manual ke metode. Tandai metode 'asinkron'.

Menunggu persyaratan ekspresi

  • CS1985: Tidak dapat menggunakan 'await' dalam klausa catch.
  • CS1986: 'await' mengharuskan jenis memiliki metode 'GetAwaiter'yang cocok.
  • CS1992: Operator 'await' hanya dapat digunakan saat terkandung dalam metode atau ekspresi lambda yang ditandai dengan pengubah ''async.
  • CS1995: Operator 'await' hanya dapat digunakan dalam ekspresi kueri, yaitu dalam ekspresi koleksi pertama dari klausa 'from' awal atau dalam ekspresi koleksi dari klausa 'join'.
  • CS1996: Tidak dapat menunggu dalam isi pernyataan kunci.
  • CS4008: Tidak dapat menunggu 'void'.
  • CS4032: Operator 'await' hanya dapat digunakan dalam metode asinkron. Pertimbangkan untuk menandai metode ini dengan pengubah 'async' dan mengubah jenis pengembaliannya menjadi 'Task<T>'.
  • CS4033: Operator 'await' hanya dapat digunakan dalam metode asinkron. Pertimbangkan untuk menandai metode ini dengan pengubah 'async' dan mengubah jenis pengembaliannya menjadi 'Task'.
  • CS4034: Operator 'await' hanya dapat digunakan dalam metode asinkron. Pertimbangkan untuk menandai metode ini dengan pengubah 'asinkron'.
  • CS8178: Referensi yang dikembalikan oleh panggilan ini tidak dapat dipertahankan di seluruh batas 'await' atau ''yield.
  • CS8411: Pernyataan foreach asinkron tidak dapat beroperasi pada variabel jenis karena jenis tidak berisi instans publik atau definisi ekstensi yang sesuai untuk anggota yang diperlukan.
  • CS4001: Tidak dapat menunggu ekspresi.
  • CS4003: 'await' tidak dapat digunakan sebagai pengidentifikasi dalam metode asinkron atau ekspresi lambda.
  • CS4007: Instans tipe tidak dapat dipertahankan di seluruh batas 'await' atau 'yield'.
  • CS4011: 'await' mengharuskan bahwa jenis pengembalian 'GetAwaiter()' dilengkapi dengan anggota 'IsCompleted', 'OnCompleted', dan 'GetResult', serta menerapkan 'INotifyCompletion' atau 'ICriticalNotifyCompletion'.
  • CS4027: Tipe tidak menerapkan anggota yang diperlukan.
  • CS4028: 'await' mengharuskan jenis memiliki metode 'GetAwaiter' yang sesuai. Apakah Anda kehilangan direktif penggunaan untuk 'Sistem'?
  • CS8100: Operator 'await' tidak dapat digunakan dalam penginisialisasi variabel skrip statis.

Item berikut menjelaskan cara memperbaiki setiap kesalahan. Untuk informasi selengkapnya tentang await operator dan pola awaiter, lihat Pemrograman asinkron dengan async dan await.

  • Tambahkan pengubah async ke metode atau ekspresi lambda yang berisi await ekspresi (CS1992, CS4032, CS4033, CS4034). Pengompilasi memerlukan pengubah async sehingga dapat menghasilkan komputer status yang menangani suspensi asinkron dan dimulainya kembali. Tiga varian kesalahan ini memberikan saran khusus konteks untuk jenis pengembalian yang benar.
  • Pindahkan ekspresi await keluar dari blok catch ketika Anda menargetkan C# 5 atau sebelumnya (CS1985). Dimulai dengan C# 6, pengkompilasi mendukung await di kedua blok catch dan finally. Kesalahan ini tidak lagi diproduksi di C# 6 dan yang lebih baru.
  • Memindahkan ekspresi keluar dari blok pernyataan (CS1996). Penangguhan asinkron saat memegang kunci berisiko terjadi kebuntuan. Kunci tetap tertahan selama proses pergantian utas di mana kode lain mungkin sedang menunggu kunci yang sama.
  • Restrukturisasi ekspresi kueri sehingga await hanya muncul dalam ekspresi koleksi pertama dari klausa from awal atau dalam ekspresi koleksi dari klausa join (CS1995). Klausa kueri lainnya diterjemahkan ke dalam ekspresi lambda yang tidak mendukung penangguhan asinkron.
  • Ubah jenis ekspresi yang ditunggu sehingga mengekspos metode yang dapat diakses GetAwaiter() yang mengikuti pola awaiter (CS1986, CS4028). Jenisnya dapat mengimplementasikan pola secara langsung atau melalui metode ekstensi. Jika metode tersebut ada tetapi arahan GetAwaiter untuk using hilang, pengkompilasi menghasilkan pesan System yang lebih spesifik alih-alih CS1986.
  • Pastikan jenis awaiter yang dikembalikan oleh GetAwaiter() memiliki IsCompleted, , OnCompleteddan GetResult anggota dan mengimplementasikan INotifyCompletion atau ICriticalNotifyCompletion (CS4011, CS4027). Ekspresiawait ini bergantung pada anggota-anggota tersebut untuk memeriksa status penyelesaian, mendaftarkan lanjutan, dan mengambil hasil.
  • Ubah jenis pengembalian metode yang disebut dari void ke Task atau Task<TResult> sehingga hasilnya dapat ditunggu (CS4008). Anda tidak dapat menunggu metode void yang mengembalikan nilai karena tidak ada objek tugas untuk melacak penyelesaian atau menyebarkan pengecualian.
  • Ubah ekspresi yang ditunggu menjadi jenis yang mendukung pola penawa (CS4001). Jenis seperti int, string, dan jenis bawaan lainnya tidak memiliki metode GetAwaiter dan tidak dapat di-await secara langsung.
  • Simpan hasil panggilan metode pengembalian ref dalam variabel lokal sebelum menggunakan await (CS8178). Referensi yang dikembalikan oleh metode tidak dapat dipertahankan di seluruh batas await karena mesin status asinkron mungkin menangguhkan dan kemudian melanjutkan di utas atau konteks yang berbeda, sehingga membuat referensi menjadi tidak valid.
  • Terapkan IAsyncEnumerable<T> pada jenis koleksi, atau tambahkan metode yang dapat diakses GetAsyncEnumerator yang mengembalikan jenis dengan Current anggota dan MoveNextAsync (CS8411). Pernyataan ini await foreach memerlukan jenis koleksi untuk mengikuti pola asinkron yang dapat dijumlahkan.
  • Ganti nama variabel atau parameter lokal apa pun yang await dinamai async di dalam metode atau ekspresi lambda (CS4003). Di dalam konteks asinkron, await adalah kata kunci kontekstual dan tidak dapat digunakan sebagai pengidentifikasi.
  • Pindahkan await ekspresi keluar dari penginisialisasi variabel skrip statis dan ke dalam isi metode (CS8100). Penginisialisasi statis berjalan di luar konteks asinkron, jadi await tidak tersedia di lokasi tersebut.
  • Restrukturasi kode agar instance ref struct tidak perlu dipertahankan melewati batas await atau yield (CS4007). Mesin status asinkron menyimpan variabel lokal pada tumpukan, dan ref struct jenis terikat tumpukan berdasarkan desain - mereka tidak dapat dipindahkan dengan aman ke penyimpanan timbunan di seluruh titik suspensi.

Persyaratan tanda tangan metode asinkron

  • CS1983: Karena ini adalah metode asinkron, ekspresi pengembalian harus berjenis 'T' daripada 'Task<T>'.
  • CS1994: Pengubah 'async' hanya dapat digunakan dalam metode yang memiliki tubuh.
  • CS4009: Titik masuk yang void atau mengembalikan int tidak bisa asinkron.
  • CS8892: Metode tidak akan digunakan sebagai titik masuk karena titik masuk sinkron ditemukan.
  • CS8935: Atribut AsyncMethodBuilder tidak diizinkan pada metode anonim tanpa jenis pengembalian eksplisit.
  • CS8940: Jenis pengembalian seperti tugas umum diharapkan, tetapi jenis yang ditemukan dalam atribut 'AsyncMethodBuilder' tidak cocok. Ini harus merupakan jenis aritas generik yang tidak terikat, dan jenis yang berisi (jika ada) harus non-generik.
  • CS8403: Metode dengan blok iterator harus 'async' untuk mengembalikan '{1}'.
  • CS9330: 'MethodImplAttribute.Async' tidak dapat diterapkan secara manual ke metode. Tandai metode 'async'.
  • CS4005: Metode asinkron tidak dapat memiliki parameter jenis pointer.
  • CS4006: __arglist tidak diizinkan dalam daftar parameter metode asinkron.
  • CS4010: Tidak dapat mengonversi lambda asinkron ke tipe delegasi. Lambda asinkron dapat mengembalikan void, Task, atau Task<T>, yang tidak satu pun dapat dikonversi ke tipe pengembalian.
  • CS4012: Parameter jenis tidak dapat dideklarasikan dalam metode asinkron atau ekspresi lambda asinkron.
  • CS4015: 'MethodImplOptions.Synchronized' tidak dapat diterapkan ke metode asinkron.
  • CS4016: Karena ini adalah metode asinkron, ekspresi pengembalian harus dari tipe tugas, bukan dari tipe umum.
  • CS8031: Ekspresi lambda asinkron yang dikonversi ke delegat pengembalian tugas tidak dapat mengembalikan nilai.
  • CS8204: Agar tipe dapat digunakan sebagai AsyncMethodBuilder untuk tipe, properti Task-nya harus mengembalikan tipe yang diperlukan, bukan tipe yang dideklarasikan.

Item berikut menjelaskan cara memperbaiki setiap kesalahan. Untuk informasi selengkapnya tentang deklarasi metode asinkron, lihat pengubah async dan jenis pengembalian Asinkron.

  • Ubah ekspresi pengembalian agar sesuai dengan jenis hasil yang mendasar metode asinkron (CS1983, CS4016). Ketika metode asinkron mengembalikan Task<T>, pernyataan return harus menyediakan nilai jenis T, bukan Task<T>, karena mesin status yang dihasilkan kompilator membungkus nilai dalam sebuah task secara otomatis. CS1983 muncul ketika metode kembali Task<T> dan ekspresinya adalah T; CS4016 mencakup kasus umum di mana jenis ekspresi pengembalian tidak cocok.
  • Hapus pengubah async dari metode yang tidak memiliki isi, seperti metode abstrak atau deklarasi metode antarmuka (CS1994). Pengubah async memerlukan isi metode sehingga pengkompilasi dapat menghasilkan implementasi komputer status.
  • Ubah jenis pengembalian titik entri asinkron menjadi Task atau Task<TResult> (CS4009). Dimulai dengan C# 7.1, Main metodenya bisaasync, tetapi harus mengembalikan Task atau Task<int> - async void dan async int bukan tanda tangan titik masuk yang valid.
  • Hapus atau ganti nama satu titik entri saat proyek berisi metode sinkron dan asinkron Main (CS8892). Pengompilasi memilih titik masuk sinkron dan mengeluarkan peringatan ini untuk kandidat asinkron yang diabaikannya.
  • Tambahkan jenis pengembalian eksplisit ke ekspresi lambda sebelum menerapkan [AsyncMethodBuilder] atribut (CS8935). Pengompilasi tidak dapat menyelesaikan jenis penyusun untuk metode anonim yang jenis pengembaliannya disimpulkan, karena atribut harus dicocokkan dengan jenis pengembalian tertentu pada waktu kompilasi.
  • Ubah tipe yang ditentukan dalam atribut [AsyncMethodBuilder] ke tipe generik tidak terikat dengan satu keseragaman, seperti MyTaskMethodBuilder<> dibandingkan dengan MyTaskMethodBuilder<T> atau tipe non-generik (CS8940). Jenis penyusun yang berisi, jika ada, juga harus non-generik. Pengkompilasi memerlukan bentuk ini sehingga dapat membangun pembangun untuk jenis pengembalian seperti tugas konkret.
  • Ganti atribut manual [MethodImpl(MethodImplOptions.Async)] dengan async kata kunci pada deklarasi metode (CS9330). Flag MethodImplOptions.Async dicadangkan untuk penggunaan runtime internal dan tidak dapat diterapkan langsung dalam kode pengguna.
  • Tambahkan pengubah async ke metode yang berisi blok iterator dan kembalikan IAsyncEnumerable<T> atau IAsyncEnumerator<T> (CS8403). Tanpa pengubah async , pengompilasi memperlakukan metode sebagai iterator sinkron dan tidak dapat menghasilkan mesin status aliran asinkron.
  • Hapus parameter jenis pointer dari metode asinkron (CS4005). Pointer mereferensikan lokasi memori tetap yang tidak dapat dipertahankan dengan aman di seluruh titik suspensi asinkron di mana eksekusi mungkin dilanjutkan pada utas yang berbeda.
  • Hapus __arglist dari daftar parameter metode asinkron (CS4006). Daftar argumen dengan panjang variabel bergantung pada konvensi panggilan berbasis tumpukan yang tidak kompatibel dengan mesin status asinkron yang dialokasikan di heap.
  • Hapus refparameter , in, atau out , dan parameter jenis ref struct seperti Span<T> atau ReadOnlySpan<T>, dari metode asinkron atau ekspresi lambda asinkron (CS4012). Jenis parameter ini terkait dengan stack dan tidak dapat ditangkap dengan aman dalam penutupan mesin status asinkron yang dialokasikan di heap.
  • Ubah jenis delegasi target agar sesuai dengan jenis pengembalian lambda asinkron (CS4010). Lambda asinkron dapat mengembalikan void, , Taskatau Task<TResult>, dan pengompilasi tidak dapat mengonversinya ke jenis delegasi seganter yang mengharapkan jenis pengembalian yang berbeda.
  • Hapus ekspresi return dari lambda asinkron yang ditetapkan ke delegasi pengembalian Task non-generik, atau ubah jenis delegasi menjadi Func<Task<T>> sehingga lambda dapat mengembalikan nilai (CS8031). Delegasi non-generik Task-returning mewakili operasi asinkron tanpa hasil, jadi mengembalikan nilai adalah ketidakcocokan tipe.
  • [MethodImpl(MethodImplOptions.Synchronized)] Hapus atribut dari metode asinkron (CS4015). Opsi Synchronized ini memperoleh kunci untuk seluruh eksekusi metode, tetapi metode asinkron dapat menangguhkan dan melanjutkan di utas yang berbeda, membuat pemahaman kunci menjadi tidak terdefinisi.
  • Koreksi jenis kustom AsyncMethodBuilder sehingga propertinya mengembalikan jenis yang sama dengan jenis pengembalian yang dinyatakan Task metode asinkron (CS8204). Pengkompilasi menggunakan properti penyusun Task untuk mendapatkan objek tugas akhir, sehingga ketidakcocokan jenis mencegah komputer status berfungsi dengan benar.

Praktik asinkron

  • CS1989: Ekspresi lambda asinkron tidak dapat dikonversi ke pohon ekspresi.
  • CS1991: 'Type' tidak dapat menerapkan 'event' karena merupakan peristiwa Windows Runtime dan 'event' adalah peristiwa .NET biasa.
  • CS1997: Karena fungsi adalah metode asinkron yang mengembalikan nilai, kata kunci pengembalian tidak boleh diikuti oleh ekspresi objek.
  • CS1998: Metode asinkron ini tidak memiliki operator 'await' dan akan berjalan secara sinkron. Pertimbangkan untuk menggunakan operator 'await' untuk menunggu panggilan API non-pemblokiran, atau 'await Task.Run(...)' untuk melakukan pekerjaan terikat CPU pada utas latar belakang.
  • CS4014: Karena panggilan ini tidak ditunggu, eksekusi metode saat ini berlanjut sebelum panggilan selesai. Pertimbangkan untuk menerapkan await operator ke hasil panggilan.
  • CS8177: Metode asinkron tidak dapat memiliki variabel lokal dengan referensi.
  • CS9123: Operator '&' tidak boleh digunakan pada parameter atau variabel lokal dalam metode asinkron.
  • CS4029: Tidak dapat mengembalikan ekspresi jenis 'void'.
  • CS4030: Atribut keamanan tidak dapat diterapkan ke metode Asinkron.
  • CS4031: Metode asinkron tidak diizinkan dalam Antarmuka, Kelas, atau Struktur yang memiliki atribut 'SecurityCritical' atau 'SecuritySafeCritical'.

Item berikut menjelaskan cara memperbaiki setiap kesalahan. Untuk informasi selengkapnya, lihat Pemrograman asinkron dengan async dan await dan await operator.

  • await Tambahkan operator ke setiap panggilan yang mengembalikan Task atau Task<TResult>, atau secara eksplisit membuang hasilnya dengan _ = jika perilaku fire-and-forget benar-benar dimaksudkan (CS4014). Tanpa await, pengecualian apa pun yang dilemparkan oleh operasi asinkron hilang secara diam-diam, dan metode panggilan terus dijalankan sebelum operasi selesai, yang dapat menyebabkan bug urutan dan kebenaran yang halus.
  • return Hapus ekspresi dari metode asinkron yang jenis pengembaliannya adalah Task (non-generik), atau ubah jenis pengembalian menjadi Task<T> ketika metode perlu mengembalikan nilai (CS1997). Dalam metode asinkron yang mengembalikan Task, pengkompilasi menghasilkan pembungkus tugas - mengembalikan nilai adalah jenis ketidakcocokan karena tanda tangan metode tidak menjanjikan hasil.
  • Tambahkan setidaknya satu await ekspresi ke isi metode, atau hapus async pengubah dan kembalikan tugas secara langsung (CS1998). Metode async yang tanpa ekspresi apapun berjalan sepenuhnya secara sinkron, yang menambahkan overhead mesin status yang tidak perlu. Jika metode secara sengaja membungkus operasi sinkron, menghapus async dan mengembalikan tugas tersebut secara eksplisit menghilangkan overhead tersebut.
  • Tulis ulang ekspresi lambda sehingga tidak digunakan async saat ditetapkan ke jenis pohon ekspresi seperti Expression<Func<...>> (CS1989). Pohon ekspresi mewakili kode sebagai struktur data yang dapat dianalisis atau diterjemahkan oleh pengkompilasi, tetapi komputer status kompleks yang async menghasilkan tidak dapat ditangkap di pohon ekspresi.
  • Ubah implementasi peristiwa sehingga deklarasi antarmuka dan kelas pelaksana menyetujui apakah peristiwa menggunakan semantik Windows Runtime atau semantik .NET reguler (CS1991). Kesalahan ini berlaku untuk skenario interop Windows Runtime di mana peristiwa WinRT tidak dapat diimplementasikan sebagai peristiwa .NET biasa atau sebaliknya.
  • Hapus operator pengambil alamat (&) dari ekspresi yang merujuk parameter atau variabel lokal di dalam metode asinkron (CS9123). Mesin status asinkron dapat merelokasi variabel yang ditangkap ke tumpukan selama penangguhan, yang akan membatalkan validitas setiap penunjuk yang diperoleh melalui alamat dari.
  • Hapus variabel lokal berdasarkan referensi dari metode asinkron, atau pastikan variabel tersebut tidak menjangkau await batas (CS8177). Mesin status asinkron menangkap variabel lokal dalam closure yang dialokasikan di heap, dan referensi ke lokasi stack tidak dapat dipertahankan dengan aman melewati titik-titik penangguhan. Di C# 13 dan yang lebih baru, ref variabel lokal diizinkan dalam metode asinkron selama mereka tidak menjangkau batas await, dan kesalahan ini tidak akan muncul.
  • return Hapus pernyataan yang mengembalikan hasil metode void-returning, atau ubah metode yang dipanggil untuk mengembalikan nilai (CS4029). Anda tidak dapat menggunakan return SomeVoidMethod(); karena void bukan jenis yang dapat dikembalikan sebagai nilai. Entah hapus kata kunci return dan panggil metode sebagai pernyataan terpisah, atau ubah deklarasi metode yang dipanggil untuk mengembalikan tipe konkret.
  • Hapus atribut keamanan seperti [SecurityCritical] atau [SecuritySafeCritical] dari metode asinkron (CS4030), atau hapus async pengubah dari metode dalam jenis yang ditandai dengan atribut ini (CS4031). Anotasi keamanan akses kode berlaku untuk metode deklarasikan, tetapi mesin status asinkron yang dihasilkan kompilator berjalan dalam konteks terpisah di mana anotasi keamanan tersebut tidak dapat diberlakukan.