亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何從另一個類中運行的另一個線程更新UI

如何從另一個類中運行的另一個線程更新UI

C++
暮色呼如 2019-09-04 13:05:45
如何從另一個類中運行的另一個線程更新UI我目前正在編寫我的第一個關于C#的程序,我對該語言非常陌生(迄今為止只用于C)。我做了很多研究,但所有的答案都太籠統了,我根本無法解決問題。所以這里是我(非常常見)的問題:我有一個WPF應用程序,它從用戶填充的幾個文本框中獲取輸入,然后使用它來對它們進行大量計算。它們應該花費大約2-3分鐘,所以我想更新進度條和文本塊,告訴我當前的狀態。此外,我需要存儲用戶的UI輸入并將它們提供給線程,所以我有第三個類,我用它來創建一個對象,并希望將此對象傳遞給后臺線程。顯然我會在另一個線程中運行計算,因此UI不會凍結,但我不知道如何更新UI,因為所有計算方法都是另一個類的一部分。經過大量的研究后,我認為最好的方法是使用調度員和TPL,而不是背景工作者,這里有一個非常簡單的程序結構:public partial class MainWindow : Window{     public MainWindow()     {         Initialize Component();     }     private void startCalc(object sender, RoutedEventArgs e)     {         inputValues input = new inputValues();         calcClass calculations = new calcClass();         try         {              input.pota = Convert.ToDouble(aVar.Text);              input.potb = Convert.ToDouble(bVar.Text);              input.potc = Convert.ToDouble(cVar.Text);              input.potd = Convert.ToDouble(dVar.Text);              input.potf = Convert.ToDouble(fVar.Text);              input.potA = Convert.ToDouble(AVar.Text);              input.potB = Convert.ToDouble(BVar.Text);              input.initStart = Convert.ToDouble(initStart.Text);              input.initEnd = Convert.ToDouble(initEnd.Text);              input.inita = Convert.ToDouble(inita.Text);              input.initb = Convert.ToDouble(initb.Text);              input.initc = Convert.ToDouble(initb.Text);          }          catch          {              MessageBox.Show("Some input values are not of the expected Type.", "Wrong Input", MessageBoxButton.OK, MessageBoxImage.Error);          }          Thread calcthread = new Thread(new ParameterizedThreadStart(calculations.testMethod);          calcthread.Start(input);     }public class inputValues{     public double pota, potb, potc, potd, potf, potA, potB;     public double initStart, initEnd, inita, initb, initc;}public class calcClass{如果有人簡單解釋如何從testmethod內部更新UI,我將非常感激。由于我是C#和面向對象編程的新手,我很可能不會理解太復雜的答案,但我會盡我所能。此外,如果某人有更好的想法(可能使用背景工作者或其他任何東西),我很樂意看到它。
查看完整描述

3 回答

?
largeQ

TA貢獻2039條經驗 獲得超8個贊

你應該使用Dispatcher更新UI線程上的控件,并且正確地說,長時間運行的進程不應該在UI線程上運行。即使您在UI線程上異步運行長時間運行的進程,它仍然可能導致性能問題。

應該注意的是,Dispatcher.CurrentDispatcher它將返回當前線程的調度程序,而不一定是UI線程。我認為你可以使用它Application.Current.Dispatcher來獲取對UI線程的調度程序的引用,如果你可以使用它,但如果沒有,你將不得不將UI調度程序傳遞給你的后臺線程。

通常我使用任務并行庫進行線程操作而不是BackgroundWorker。我發現它更容易使用。

例如,

Task.Factory.StartNew(() => 
    SomeObject.RunLongProcess(someDataObject));

哪里

void RunLongProcess(SomeViewModel someDataObject){
    for (int i = 0; i <= 1000; i++)
    {
        Thread.Sleep(10);

        // Update every 10 executions
        if (i % 10 == 0)
        {
            // Send message to UI thread
            Application.Current.Dispatcher.BeginInvoke(
                DispatcherPriority.Normal,
                (Action)(() => someDataObject.ProgressValue = (i / 1000)));
        }
    }}



查看完整回答
反對 回復 2019-09-07
  • 3 回答
  • 0 關注
  • 631 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號