Saya punya antarmuka dengan beberapa fungsi asinkron. Beberapa kelas yang mengimplementasikan antarmuka tidak memiliki apa-apa untuk menunggu, dan beberapa mungkin hanya melempar. Agak mengganggu dengan semua peringatannya.
Saat tidak menggunakan await dalam fungsi async.
Apakah mungkin untuk menyembunyikan pesan tersebut?
public async Task<object> test()
{
throw new NotImplementedException();
}
peringatan CS1998: Metode async 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 yang terikat dengan CPU pada thread latar belakang.
c#
asynchronous
Simon
sumber
sumber
Jawaban:
Metode kembali
Task
, saya yakin.async
adalah detail implementasi, jadi tidak bisa diterapkan ke metode antarmuka.Dalam kasus ini, Anda dapat memanfaatkan fakta yang
async
merupakan detail implementasi.Jika Anda tidak punya apa-apa
await
, maka Anda bisa kembaliTask.FromResult
:Dalam kasus melempar
NotImplementedException
, prosedurnya sedikit lebih bertele-tele:Jika Anda memiliki banyak metode melempar
NotImplementedException
(yang dengan sendirinya dapat menunjukkan bahwa beberapa pemfaktoran ulang tingkat desain akan baik), maka Anda dapat membungkus wordiness menjadi kelas pembantu:Kelas pembantu juga mengurangi sampah yang GC dinyatakan akan harus mengumpulkan, karena masing-masing metode dengan tipe kembali sama dapat berbagi nya
Task
danNotImplementedException
benda-benda.Saya memiliki beberapa contoh jenis "konstanta tugas" lainnya di perpustakaan AsyncEx saya .
sumber
Task
. Sebaliknya, metode Anda akan membuang bahkan sebelum mendapat kesempatan untuk membuat fileTask
. Menurut saya pola terbaik adalah mendefinisikanasync
metode tanpaawait
operator. Ini memastikan kode di dalam metode semua diperlakukan sebagai bagian dariTask
.await Task.FromResult(0);
metode Anda. Ini seharusnya tidak memiliki dampak kinerja yang signifikan (tidak seperti Task.Yield ()).return Task.CompletedTask;
- yang paling sederhana dari semuanya.Opsi lain, jika Anda ingin menjaga isi fungsi tetap sederhana dan tidak menulis kode untuk mendukungnya, cukup dengan menekan peringatan dengan #pragma:
Jika ini cukup umum, Anda dapat meletakkan pernyataan nonaktifkan di bagian atas file dan menghilangkan pemulihan.
http://msdn.microsoft.com/en-us/library/441722ys(v=vs.110).aspx
sumber
Cara lain untuk mempertahankan kata kunci async (jika Anda ingin menyimpannya) adalah dengan menggunakan:
Setelah Anda mengisi metode, Anda cukup menghapus pernyataan tersebut. Saya sering menggunakan ini terutama ketika sebuah metode mungkin menunggu sesuatu tetapi tidak setiap implementasi benar-benar melakukannya.
sumber
Task.Run
panggilan.Task.CompletedTask
sepertinya tidak ada lagi.Task.FromResult
adalah jawaban yang lebih baik. Untuk itu, jika Anda sedang akan melemparkan pengecualian, tampaknya jawaban lain telah datang ke dalam bermain tentangTask.FromException
membuat tidak pernah solusi ideal ini. Apakah anda setujuAda perbedaan antara solusi dan secara tegas Anda harus tahu bagaimana pemanggil akan memanggil metode async, tetapi dengan pola penggunaan default yang mengasumsikan ".Wait ()" pada hasil metode - " return Task.CompletedTask " adalah solusi terbaik.
Catatan:
FromResult
tidak bisa dibandingkan secara langsung.Kode Tes:
}
sumber
#pragma
satu itu tampaknya menimbulkan biaya tambahan. Mungkin sama banyaknya dengan jika alih-alih mengembalikanCompletedTask
Anda membuat dan menyelesaikan fileAsyncOperation
. Akan menyenangkan untuk dapat memberi tahu kompiler bahwa tidak masalah untuk melewatkannya ketika metode tetap berjalan secara sinkron.Task.CompletedTask
mirip denganTask.FromResult
? Menarik untuk diketahui - saya berharap FromResult akan menjadi yang paling analog dan tetap menjadi yang terbaik jika Anda harus mengembalikan suatu nilai.Saya tahu ini adalah utas lama, dan mungkin ini tidak akan memiliki efek yang tepat untuk semua penggunaan, tetapi berikut ini sedekat yang saya bisa untuk bisa dengan mudah melempar NotImplementedException ketika saya belum menerapkan metode, tanpa mengubah tanda tangan metode. Jika bermasalah, saya akan senang mengetahuinya, tetapi itu hampir tidak penting bagi saya: Saya hanya menggunakan ini saat dalam pengembangan, jadi bagaimana kinerjanya tidak terlalu penting. Namun, saya akan senang mendengar mengapa itu ide yang buruk, jika memang demikian.
Inilah tipe yang saya tambahkan untuk memungkinkannya.
sumber
Sama seperti pembaruan Stephen's Answer, Anda tidak perlu lagi menulis
TaskConstants
kelas karena ada metode pembantu baru:sumber
Jika Anda sudah menautkan ke Reactive Extension, Anda juga dapat melakukan:
Reaktif dan asinkron / menunggu keduanya luar biasa dalam dan dengan sendirinya, tetapi mereka juga bermain bersama dengan baik.
Termasuk yang dibutuhkan adalah:
sumber
Mungkin terjadi cs1998 di bawah ini.
Kemudian Anda dapat mereformasi di bawah.
sumber
Anda bisa mencoba ini:
sumber
Coba ini:
[System.Diagnostics.CodeAnalysis.SuppressMessage("Await.Warning", "CS1998:Await.Warning")]
Lihat: https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.codeanalysis.suppressmessageattribute?view=netframework-4.7.2
sumber
Jika Anda tidak memiliki apa-apa untuk menunggu, kembalikan Task.FromResult
sumber
Berikut beberapa alternatif tergantung pada tanda tangan metode Anda.
sumber
sumber
Anda dapat melepaskan kata kunci async dari metode dan mengembalikannya ke Task;
sumber