Apakah ada cara 'standar' untuk menentukan bahwa kelanjutan tugas harus dijalankan pada utas dari mana tugas awal dibuat?
Saat ini saya memiliki kode di bawah ini - itu berfungsi tetapi melacak pengirim dan membuat Tindakan kedua sepertinya overhead yang tidak perlu.
dispatcher = Dispatcher.CurrentDispatcher;
Task task = Task.Factory.StartNew(() =>
{
DoLongRunningWork();
});
Task UITask= task.ContinueWith(() =>
{
dispatcher.Invoke(new Action(() =>
{
this.TextBlock1.Text = "Complete";
}
});
Control.Invoke(Action)
, yaitu.TextBlock1.Invoke
alih-alihdispatcher.Invoke
Jawaban:
Sebut kelanjutan dengan
TaskScheduler.FromCurrentSynchronizationContext()
:Ini hanya cocok jika konteks eksekusi saat ini ada di utas UI.
sumber
await
adalah pola yang baik - tetapi hanya jika Anda berada di dalamasync
konteks (seperti metode yang dideklarasikanasync
). Jika tidak, masih perlu melakukan sesuatu seperti jawaban ini.Dengan async, Anda cukup melakukan:
Namun:
sumber
false
versi membingungkan saya. Saya pikirfalse
berarti itu dapat berlanjut pada utas yang berbeda .async
metode (yang diperlukan, untuk digunakanawait
). Apa jawabannya ketikaawait
tidak tersedia?Jika Anda memiliki nilai balik yang perlu Anda kirim ke UI, Anda dapat menggunakan versi generik seperti ini:
Ini dipanggil dari ViewModel MVVM dalam kasus saya.
sumber
Saya hanya ingin menambahkan versi ini karena ini adalah utas yang sangat berguna dan saya pikir ini adalah implementasi yang sangat sederhana. Saya telah menggunakan ini berkali-kali dalam berbagai jenis jika aplikasi multithreaded:
sumber
TaskScheduler
merupakan bagian dari BCL,Dispatcher
bukan) dan dapat digunakan untuk menyusun rantai tugas yang kompleks karena tidak perlu khawatir tentang operasi async api-dan-lupa (sepertiBeginInvoke
).Sampai di sini melalui google karena saya sedang mencari cara yang baik untuk melakukan hal-hal di utas ui setelah berada di dalam panggilan Task.Run - Menggunakan kode berikut yang dapat Anda gunakan
await
untuk kembali ke UI Thread lagi.Saya harap ini membantu seseorang.
Pemakaian:
sumber
static
kelasUI
.