第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

C++
暮色呼如 2019-09-04 13:05:45
如何從另一個類中運行的另一個線程更新UI我目前正在編寫我的第一個關(guān)于C#的程序,我對該語言非常陌生(迄今為止只用于C)。我做了很多研究,但所有的答案都太籠統(tǒng)了,我根本無法解決問題。所以這里是我(非常常見)的問題:我有一個WPF應(yīng)用程序,它從用戶填充的幾個文本框中獲取輸入,然后使用它來對它們進行大量計算。它們應(yīng)該花費大約2-3分鐘,所以我想更新進度條和文本塊,告訴我當(dāng)前的狀態(tài)。此外,我需要存儲用戶的UI輸入并將它們提供給線程,所以我有第三個類,我用它來創(chuàng)建一個對象,并希望將此對象傳遞給后臺線程。顯然我會在另一個線程中運行計算,因此UI不會凍結(jié),但我不知道如何更新UI,因為所有計算方法都是另一個類的一部分。經(jīng)過大量的研究后,我認(rèn)為最好的方法是使用調(diào)度員和TPL,而不是背景工作者,這里有一個非常簡單的程序結(jié)構(gòu):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內(nèi)部更新UI,我將非常感激。由于我是C#和面向?qū)ο缶幊痰男率郑液芸赡懿粫斫馓珡?fù)雜的答案,但我會盡我所能。此外,如果某人有更好的想法(可能使用背景工作者或其他任何東西),我很樂意看到它。
查看完整描述

3 回答

?
largeQ

TA貢獻(xiàn)2039條經(jīng)驗 獲得超8個贊

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

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

通常我使用任務(wù)并行庫進行線程操作而不是BackgroundWorker。我發(fā)現(xiàn)它更容易使用。

例如,

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)));
        }
    }}



查看完整回答
反對 回復(fù) 2019-09-07
  • 3 回答
  • 0 關(guān)注
  • 630 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號