Adakah yang bisa menjelaskan apa artinya ini menjadi metode sinkron? Jika saya mencoba mengubah metode untuk async
kemudian VS mengeluh tentang hal itu.
Ini bekerja:
public Task MethodName()
{
return Task.FromResult<object>(null);
}
Ini tidak berfungsi:
public async Task MethodName()
{
return Task.FromResult<object>(null);
}
Jadi pada dasarnya saya ingin tahu apa artinya ini: Task.FromResult<object>(null);
c#
asynchronous
async-await
David Dury
sumber
sumber
return;
bekerja juga ...!void
fungsi.Jawaban:
async
metode berbeda dari metode normal. Apa pun yang Anda kembali dariasync
metode terbungkus aTask
.Jika Anda mengembalikan tidak ada nilai (batal) itu akan dibungkus
Task
, Jika Anda mengembalikannyaint
akan dibungkusTask<int>
dan sebagainya.Jika metode async Anda perlu kembali,
int
Anda akan menandai jenis pengembalian metode sebagaiTask<int>
dan Anda akan kembali polosint
bukanTask<int>
. Compiler akan mengonversikanint
keTask<int>
untuk Anda.Sameway, Ketika Anda kembali
Task<object>
, tipe pengembalian metode Anda seharusnyaTask<Task<object>>
Karena metode Anda kembali
Task
, seharusnya tidak mengembalikan nilai apa pun. Kalau tidak, itu tidak akan dikompilasi.Perlu diingat bahwa metode async tanpa
await
pernyataan tidakasync
.sumber
DoStuff()
juga. Misalnya:var x = await DoStuff();
return await Task.FromResult<object>(null);
Task.WhenAny
adalah contohnya.Anda harus menggunakan kata kunci tunggu ketika menggunakan async dan tipe pengembalian fungsi Anda harus umum Berikut adalah contoh dengan nilai balik:
Ini adalah contoh tanpa nilai balik:
Baca ini:
TPL: http://msdn.microsoft.com/en-us/library/dd460717(v=vs.110).aspx dan Tugas: http://msdn.microsoft.com/en-us/library/system.threading .tasks (v = vs.110) .aspx
Async: http://msdn.microsoft.com/en-us/library/hh156513.aspx Tunggu: http://msdn.microsoft.com/en-us/library/hh156528.aspx
sumber
null
langsung kembali daripada menunggu tugas dummy.async
metode ini akan dijalankan secara tidak sinkron dengan saran untuk menggunakanawait
kata kunci di suatu tempat dalam metode. Saya sarankan hanya menggunakanreturn Task.FromResult((object)null);
dan menghapusasync
kata kunci untuk mengurangi kebisingan peringatan kompiler.return
dalam Tugas, tetapi tugas terus dieksekusi, karenareturn
tidak mengembalikan aTask
Menambahkan kata kunci async hanyalah gula sintaksis untuk menyederhanakan pembuatan mesin negara. Intinya, kompiler mengambil kode Anda;
Dan mengubahnya menjadi;
Jika kode Anda memiliki
await
kata kunci, kompiler harus mengambil metode Anda dan mengubahnya menjadi kelas untuk mewakili mesin negara yang diperlukan untuk menjalankannya. Di setiapawait
kata kunci, keadaan variabel dan tumpukan akan dipertahankan di bidang kelas, kelas akan menambahkan dirinya sebagai kait penyelesaian untuk tugas yang Anda tunggu, lalu kembali.Ketika tugas itu selesai, tugas Anda akan dieksekusi lagi. Jadi beberapa kode tambahan ditambahkan ke bagian atas metode untuk mengembalikan keadaan variabel dan melompat ke lempengan kode Anda berikutnya.
Lihat Apa yang dihasilkan async & tunggu? untuk contoh berdarah.
Proses ini memiliki banyak kesamaan dengan cara kompiler menangani metode iterator dengan pernyataan hasil.
sumber
Ini adalah Tugas yang mengembalikan Tugas tipe String (C # fungsi anonim atau dengan kata lain delegasi digunakan 'Func')
sumber
Untuk mendapatkan respons yang tepat kembali dari metode async, Anda harus menunggu sementara memanggil metode tugas tersebut. Itu akan menunggu untuk mengubahnya kembali ke tipe nilai yang dikembalikan dan bukan tipe tugas.
sumber