Apa cara yang disarankan untuk melakukan multithreading dengan MVVM Light. Saya memiliki model yang memiliki properti bool Sibuk
public bool Busy
{
get { return busy_; }
set
{
Set(nameof(Busy), ref busy_, value, broadcast: true);
}
}
Model tampilan saya mempublikasikan model secara langsung untuk tampilan tersebut (model tersebut mewarisi ViewModelBase MVVM Light), sehingga tampilan tersebut mengikat langsung ke properti sibuk model.
Jika saya memanggil model selalu dari thread UI semuanya baik-baik saja. Tetapi jika saya melakukan hal berikut dalam model tampilan saya sehingga dapat dijalankan di thread yang berbeda
Task.Factory.StartNew(() =>
{
model_.SomeFunctionThatWillSetBusyDuringItsExecution();
});
Kemudian tentu saja Sibuk diatur dari thread non UI dan kemudian pengikatan gagal dan aplikasi mogok. Jika saya menggunakan Messenger di penyetel properti, tampaknya Messenger juga tidak secara otomatis mengirimkan kode pengendali Messenger ke thread UI.
Saya menyadari ada DispatcherHelper di MVVM Light, tetapi untuk pengikatannya sepertinya tidak membantu. Jika saya mengubah properti menjadi
public bool Busy
{
get { return busy_; }
set
{
DispatcherHelper.CheckBeginInvokeOnUI(() =>
{
Set(nameof(Busy), ref busy_, value, broadcast: true);
});
}
}
Saya masih mendapatkan pengecualian dan aplikasi mogok karena sumber pengikatan tidak ada di thread yang benar. Jadi pertanyaan saya sederhana, apa cara yang disarankan untuk melakukan multithreading seperti ini di MVVM Light?
Saya juga mencoba menggunakan syncronizationContext.
syncContext_.Post(() =>
{
Set(nameof(Busy), ref busy_, value, broadcast: true);
}, null);
Itu berfungsi jika panggilan selalu dari thread non-UI. Jika panggilan sudah berasal dari thread UI, syncContext.Post mengakibatkan fungsi Set() tidak dipanggil hingga semua kode dalam metode ViewModel selesai. Artinya, status sibuk mungkin tidak diperbarui dengan benar untuk kode yang tersisa. Jadi ini bukanlah solusi yang ideal.
Saya berterima kasih atas bantuan mengenai topik ini.