Mengintegrasikan kod asynchronous dan segerak dalam C#
Banyak projek C# tidak sepenuhnya tidak segerak. Artikel ini menangani cabaran dan penyelesaian untuk memanggil kaedah asynchronous dari dalam konteks segerak.
adakah ia boleh dilaksanakan?
Ya, mungkin untuk memanggil kaedah asynchronous dari kod segerak. Walau bagaimanapun, model pelaksanaan yang berbeza dari pengaturcaraan segerak dan asynchronous dapat menghasilkan kerumitan.
Pendekatan untuk Integrasi Selamat
Beberapa pendekatan memudahkan integrasi ini:
Kaedah 1: Task.WaitAndUnwrapException
menggunakan await
), ConfigureAwait(false)
menyediakan cara yang selamat untuk menunggu siap dan dapatkan hasilnya: Task.WaitAndUnwrapException
<code class="language-csharp">var task = MyAsyncMethod(); var result = task.WaitAndUnwrapException(); </code>
Kaedah 2: (untuk menanti sensitif konteks) AsyncContext.RunTask
mencipta konteks bersarang untuk melaksanakan tugas: AsyncContext.RunTask
<code class="language-csharp">var result = AsyncContext.RunTask(MyAsyncMethod).Result;</code>
Kaedah 3: (untuk keserasian kolam benang) Task.Run
tidak berkenaan, AsyncContext.RunTask
mengimbangi kaedah asynchronous ke kolam benang. Kaedah Asynchronous mesti bersesuaian dengan konteks kolam benang: Task.Run
<code class="language-csharp">var task = Task.Run(async () => await MyAsyncMethod()); var result = task.WaitAndUnwrapException();</code>
Atas ialah kandungan terperinci Bagaimanakah saya dapat memanggil kaedah asynchronous dengan selamat dari kaedah segerak dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!