Rumah >pembangunan bahagian belakang >C++ >Apakah perbezaan utama antara `menunggu tugas.run (); kembali; `dan` kembali tugas.run () `dalam pengaturcaraan c# async, dan bagaimanakah pengendalian pengecualian kesan ini?

Apakah perbezaan utama antara `menunggu tugas.run (); kembali; `dan` kembali tugas.run () `dalam pengaturcaraan c# async, dan bagaimanakah pengendalian pengecualian kesan ini?

Susan Sarandon
Susan Sarandonasal
2025-01-30 03:56:11619semak imbas

perbezaan utama antara await Task.Run(); return; dan return Task.Run() dalam pengaturcaraan tak segerak dan kesan terhadap rawatan yang tidak normal

What's the key difference between `await Task.Run(); return;` and `return Task.Run()` in C# async programming, and how does this impact exception handling?

Perbezaan konsep

Perbezaan utama antara kedua -dua serpihan kod adalah komunikasi yang tidak normal. Dalam versi " ", keabnormalan yang dibuang dalam tugas akan ditangkap dan disimpan dalam objek tugas yang dikembalikan. Apabila menunggu tugas, keabnormalan akan disebarkan. Sebaliknya, versi "" tidak menunggu tugas itu, jadi tidak ada kelainan yang dibuang akan ditangkap, tetapi segera membuangnya pada panggilan.

Generasi Kod await Task.Run(); return; return Task.Run();

Kod yang dihasilkan oleh kedua -dua serpihan kod ini berbeza. Dalam versi "", pengkompil menghasilkan mesin negara untuk membungkus operasi tak segerak, termasuk mengendalikan keadaan yang tidak normal. Versi "" tidak menjana mesin negara kerana ia tidak menunggu sebarang operasi tak segerak.

rawatan abnormal

pertimbangkan contoh berikut: await Task.Run(); return; return Task.Run();

Jika kita panggil , versi "" akan membuang pengecualian apabila menunggu tugas. Walau bagaimanapun, jika kita memanggil , pengecualian akan dibuang dengan segera. (Katakan

fungsi ini dikendalikan dengan betul tidak normal). kaedah void asynchronous

Untuk kaedah void tak segerak, logik komunikasi yang tidak normal adalah berbeza. Sekiranya ia wujud, keabnormalan yang dibuang dalam kaedah tidak sah yang tidak disengajakan akan dibuang dalam konteks benang semasa. Jika tidak, mereka akan dilemparkan melalui , dan pemanggil tidak dapat mengendalikannya pada bingkai timbunan yang sama.
<code class="language-csharp">static async Task OneTestAsync(int n)
{
    await Task.Delay(n);
}

static Task AnotherTestAsync(int n)
{
    return Task.Delay(n);
}</code>

simulasi penyebaran abnormal yang tidak disengajakan DoTestAsync(OneTestAsync, -2) await DoTestAsync(AnotherTestAsync, -2) Anda boleh menggunakan teknik untuk mensimulasikan tingkah laku komunikasi yang tidak normal kaedah asynchronous. DoTestAsync

Dalam contoh ini, keabnormalan akan dibuang ke dalam tugas, dan kemudian merebak melalui objek

, sama dengan keadaan .

kemungkinan kunci mati

ThreadPool.QueueUserWorkItem

versi asynchronous/menunggu lebih mudah berlaku dalam konteks penyegerakan bukan -default. Sebagai contoh, kod berikut akan berlaku dalam aplikasi WinForms atau WPF:

Ini kerana cuba menunggu penyelesaian operasi tak segerak pada benang UI, dan operasi tak segerak itu sendiri juga perlu dilaksanakan pada benang UI, mengakibatkan kunci mati.

Singkatnya,

menyediakan rawatan abnormal berstruktur, dan await Task.Run(); return; secara langsung membuang kelainan kepada pihak panggilan, dan pihak panggilan perlu dikendalikan sendiri. Kaedah untuk dipilih bergantung pada strategi pemprosesan yang tidak normal dan konteks program anda. return Task.Run(); Versi ini lebih selamat, tetapi perlu mempertimbangkan masalah kunci mati yang berpotensi; await

Atas ialah kandungan terperinci Apakah perbezaan utama antara `menunggu tugas.run (); kembali; `dan` kembali tugas.run () `dalam pengaturcaraan c# async, dan bagaimanakah pengendalian pengecualian kesan ini?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn