Saya menerapkan metode Task<Result> StartSomeTask()
dan kebetulan mengetahui hasilnya sebelum metode dipanggil. Bagaimana cara membuat Tugas <T> yang sudah selesai?
Inilah yang sedang saya lakukan:
private readonly Result theResult = new Result();
public override Task<Result> StartSomeTask()
{
var task = new Task<Result>(() => theResult);
task.RunSynchronously(CurrentThreadTaskScheduler.CurrentThread);
return task;
}
Apakah ada solusi yang lebih baik?
ValueTask
untuk tugas yang diselesaikan (yaitu untuk nilai yang sudah Anda miliki sehingga kode pada dasarnya sinkron), yang akan menghemat alokasi.Jawaban:
sumber
Saat menargetkan .NET 4.5 Anda dapat menggunakan
Task.FromResult
:Untuk membuat tugas yang gagal, gunakan
Task.FromException
:.NET 4.6 menambahkan
Task.CompletedTask
jika Anda memerlukan non generikTask
.Penanganan masalah untuk versi .NET yang lebih lama:
Saat menargetkan .NET 4.0 dengan Async Targetting Pack (atau AsyncCTP), Anda dapat menggunakannya
TaskEx.FromResult
.Untuk mendapatkan non-generik
Task
sebelum. NET 4.6, Anda dapat menggunakan fakta yangTask<T>
berasal dariTask
dan hanya meneleponTask.FromResult<object>(null)
atauTask.FromResult(0)
.sumber
FromException
metode Anda sendiri , yang berperilaku sepertiFromResult
tetapi merupakan tugas yang salah. Metode seperti itu dapat dengan mudah mengembalikannya untuk kasus kesalahannya jika penting agar pengecualian ditampilkan dalam tugas yang dihasilkan.Untuk tugas tanpa nilai balik, .NET 4.6 telah menambahkan Task.CompletedTask .
Ini mengembalikan tugas yang sudah ada di TaskStatus.RanToCompletion. Mungkin mengembalikan contoh yang sama setiap kali, tetapi dokumentasi memperingatkan Anda untuk tidak mengandalkan fakta itu.
sumber
Jika Anda menggunakan Rx, alternatifnya adalah Observable.Return (hasil) .ToTask ().
sumber
Memanggil Tugas. Ketika semua tanpa parameter akan mengembalikan tugas yang selesai.
sumber