作者name2name2 (yang~hi)
看板C_Sharp
標題[問題] WPF 與BackgroudWorker類似的方法
時間Thu Apr 14 14:19:50 2016
想請問WPF應用上有沒有和BackgroudWorker效果相同的其他方法
我曾使用Backgroundworker讓視窗按下按鈕後執行onclick方法時,
方法執行的過程中可以設成一邊回報進度到視窗的ProgressBar,
讓ProgressBar在方法執行過程中視窗不會被鎖死而能夠持續顯示進度變化,
--
另外發現如果用
Thread w = new Thread(() =>{
// 邊執行方法邊設定Progressbar進度Value或其他UI物件狀態
});
好像會因為無法跨執行緒操控UI物件,
所以會出現Exception: 呼叫執行緒無法存取此物件 因為此物件屬於另一個執行緒。
而若是用
Action methodDelegate = delegate()
{
// 邊執行方法邊設定Progressbar進度Value或其他物件狀態
};
this.Dispatcher.BeginInvoke(methodDelegate);
或
Task task = new Task(() =>
{
ProgressBar物件名稱.Dispatcher.Invoke(DispatcherPriority.ApplicationIdle
, new Action(() =>
{
// 邊執行方法邊設定Progressbar進度Value或其他物件狀態
}));
});
task.Start();
則方法執行過程中,跟使用一般方法一樣,使用者介面會被鎖住,
到了方法完全執行完後才會顯示最後一次設定的進度,
中間過程的設定進度都會因為被鎖住而無法呈現
--
想請問除了Backgroundworker之外,
還有其他方式能達到,
在方法執行過程中還能動態設定使用者介面產生變化嗎? 謝謝~
--
~
Sent from my
PCMan Combo ~
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 210.59.165.123
※ 文章網址: https://www.ptt.cc/bbs/C_Sharp/M.1460614796.A.46D.html
※ 編輯: name2name2 (210.59.165.123), 04/14/2016 15:07:01
→ Litfal: "執行方法"與"進度通知"應該分開來,前者用其他執行緒做 04/14 15:20
→ Litfal: 後者才是Dispatcher去委派 04/14 15:20
→ Litfal: 另外,在WPF裡面,最好是習慣MVVM的寫法 04/14 15:21
感謝回覆
※ 編輯: name2name2 (210.59.165.123), 04/14/2016 15:45:07
紀錄其他找到的一些東西
Is there an alternative to use the Background Worker in WPF?
http://goo.gl/rqf1Iu
※ 編輯: name2name2 (210.59.165.123), 04/15/2016 10:24:37
推 hatasum: thread裡面呼叫dispatcher.begininvoke呢? 05/02 22:49