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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何使用backgroundworker更新GUI?

如何使用backgroundworker更新GUI?

C#
慕妹3146593 2019-08-19 14:11:01
如何使用backgroundworker更新GUI?我花了一整天的時(shí)間試圖讓我的應(yīng)用程序使用線程,但沒(méi)有運(yùn)氣。我已經(jīng)閱讀了很多關(guān)于它的文檔,我仍然會(huì)遇到很多錯(cuò)誤,所以我希望你能幫助我。我有一個(gè)耗時(shí)的方法,它調(diào)用數(shù)據(jù)庫(kù)并更新GUI。這必須一直發(fā)生(或大約每30秒)。public class UpdateController{     private UserController _userController;     public UpdateController(LoginController loginController, UserController userController)     {         _userController = userController;         loginController.LoginEvent += Update;     }     public void Update()     {         BackgroundWorker backgroundWorker = new BackgroundWorker();         while(true)         {             backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);             backgroundWorker.RunWorkerAsync();         }          }     public void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)     {         _userController.UpdateUsersOnMap();     }}使用這種方法我得到一個(gè)例外,因?yàn)楹笈_(tái)工作者不是和STA線程(但從我可以理解這是我應(yīng)該使用的)。我試過(guò)一個(gè)STA線程,并給出了其他錯(cuò)誤。我認(rèn)為問(wèn)題是因?yàn)槲以谶M(jìn)行數(shù)據(jù)庫(kù)調(diào)用時(shí)嘗試更新GUI(在后臺(tái)線程中)。我應(yīng)該只進(jìn)行數(shù)據(jù)庫(kù)調(diào)用,然后以某種方式它應(yīng)該切換回主線程。在主線程執(zhí)行后,它應(yīng)該返回后臺(tái)線程,依此類推。但我看不出怎么做。應(yīng)用程序應(yīng)在數(shù)據(jù)庫(kù)調(diào)用后立即更新GUI。Firering事件似乎不起作用。背景線程只是輸入它們
查看完整描述

3 回答

?
海綿寶寶撒

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

您需要聲明并配置BackgroundWorker一次 - 然后在循環(huán)中調(diào)用RunWorkerAsync方法...

public class UpdateController{
    private UserController _userController;
    private BackgroundWorker _backgroundWorker;

    public UpdateController(LoginController loginController, UserController userController)
    {
        _userController = userController;
        loginController.LoginEvent += Update;
        _backgroundWorker = new BackgroundWorker();
        _backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
        _backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged);
        _backgroundWorker.WorkerReportsProgress= true;
    }

    public void Update()
    {
         _backgroundWorker.RunWorkerAsync();    
    }

    public void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        while (true)
        {
        // Do the long-duration work here, and optionally
        // send the update back to the UI thread...
        int p = 0;// set your progress if appropriate
        object param = "something"; // use this to pass any additional parameter back to the UI
        _backgroundWorker.ReportProgress(p, param);
        }
    }

    // This event handler updates the UI
    private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        // Update the UI here//        _userController.UpdateUsersOnMap();
    }}


查看完整回答
反對(duì) 回復(fù) 2019-08-19
?
藍(lán)山帝景

TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個(gè)贊

您必須使用Control.InvokeRequired屬性來(lái)確定您是否在后臺(tái)線程上。然后,您需要通過(guò)Control.Invoke方法調(diào)用修改UI的邏輯,以強(qiáng)制UI操作在主線程上發(fā)生。您可以通過(guò)創(chuàng)建委托并將其傳遞給Control.Invoke方法來(lái)完成此操作。這里的問(wèn)題是你需要從Control派生的一些對(duì)象來(lái)調(diào)用這些方法。

編輯:當(dāng)另一個(gè)用戶發(fā)布時(shí),如果您可以等到BackgroundWorker.Completed事件來(lái)更新您的UI,那么您可以訂閱該事件并直接調(diào)用您的UI代碼。在主應(yīng)用程序線程上調(diào)用BackgroundWorker_Completed。我的代碼假設(shè)您希望在操作期間進(jìn)行更新。我的方法的一個(gè)替代方法是訂閱BwackgroundWorker.ProgressChanged事件,但我相信在這種情況下你仍然需要調(diào)用Invoke來(lái)更新你的UI。

例如

public class UpdateController{
    private UserController _userController;        
    BackgroundWorker backgroundWorker = new BackgroundWorker();

    public UpdateController(LoginController loginController, UserController userController)
    {
        _userController = userController;
        loginController.LoginEvent += Update;
    }

    public void Update()
    {                        
         // The while loop was unecessary here
         backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
         backgroundWorker.RunWorkerAsync();                 
    }

    public delegate void DoUIWorkHandler();


    public void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
       // You must check here if your are executing on a background thread.
       // UI operations are only allowed on the main application thread
       if (someControlOnMyForm.InvokeRequired)
       {
           // This is how you force your logic to be called on the main
           // application thread
           someControlOnMyForm.Invoke(new             
                      DoUIWorkHandler(_userController.UpdateUsersOnMap);
       }
       else
       {
           _userController.UpdateUsersOnMap()
       }
    }}


查看完整回答
反對(duì) 回復(fù) 2019-08-19
?
冉冉說(shuō)

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超1個(gè)贊

你應(yīng)該刪除while(true),你正在添加無(wú)限的事件處理程序并無(wú)限次地調(diào)用它們。


查看完整回答
反對(duì) 回復(fù) 2019-08-19
  • 3 回答
  • 0 關(guān)注
  • 522 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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