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

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

從后臺線程更新 UI

從后臺線程更新 UI

C#
慕運維8079593 2021-06-02 09:58:29
我有一個后臺任務,它位于從外部硬件設備讀取數據的循環(huán)中。設備公開一個每 100 毫秒遞增的“計數器”——當這個值改變時,我從設備中獲取下一個數據值并引發(fā)一個事件。偽代碼:-public event HasDataEventArgs DataReceived;while (some condition){    // Wait for device counter to increment    while (DeviceCounterValue == _lastDeviceCounterValue)    {       Thread.Sleep(3);    }    _lastDeviceCounterValue = DeviceCounterValue;    // Read data value from device    var data = GetDataFromDevice();    // Raise my event    DataReceived(this, new HasDataEventArgs(data)); }我還有一個訂閱此事件的 UI 視圖。事件處理程序在圖表上繪制數據值并設置許多綁定屬性。大多數情況下,這一切都很好,但是如果我(比如)拖動一個窗口或打開一個模態(tài)對話框,它偶爾會導致數據丟失。似乎發(fā)生的是外部設備計數器繼續(xù)遞增,但“while”循環(huán)實際上已短暫停止,因此錯過了這些更改。很偶爾我會看到,即使我不是瞎搞與在UI什么相同的效果。視圖中的事件處理程序沒有做太多事情,但這是一個復雜的桌面應用程序,其他后臺線程更新其他綁定控件。也許這個特定的過程只是在性能方面使事情超出了邊緣,尤其是當我開始拖動窗口時?我想知道是否可以將事件處理程序代碼包裝在 a 中Task.Run(),(我假設)這會導致它立即將控制權返回給 while 循環(huán),而不必等待事件處理程序執(zhí)行它的操作。不過,這聽起來很hacky - 我是否在為這樣的事情找麻煩,特別是考慮到事件處理程序將被調用的頻率(每 100 毫秒)?
查看完整描述

2 回答

?
慕妹3146593

TA貢獻1820條經驗 獲得超9個贊

您遺漏了一些細節(jié),主要是事件處理程序在 GUI 線程上執(zhí)行的操作。Invoke 或 BeginInvoke 等。

但如果保護您的數據最重要,還有另一種選擇:將新數據推送到 ConcurrentQueue。引發(fā) Received 事件是可以的,但可選,您可能不需要它。

主線程可以在自己的時間清空隊列。例如使用定時器。

您的屏幕更新仍然會斷斷續(xù)續(xù),但您不應再丟失數據。


查看完整回答
反對 回復 2021-06-05
?
森林海

TA貢獻2011條經驗 獲得超2個贊

您必須拆分(線程方式)兩件事:后臺工作和繪圖工作。一般來說,這是如何做這些事情的方式,但要具體 - 如果您的繪圖需要時間,那么您的工作線程可能無法按時處理傳入的數據,您可能會丟失一些數據/ 省略(這就是您實際觀察到的)。


這是一種方法(該方法必須是 UI 類的成員 - 窗口、用戶控件等):


void OnDataReceived(object sender, DataEventArgs e)

{

    // here we're in the context of the working thread


    // this call will return immediately giving control back to the working thread

    Dispatcher.BeginInvoke(

        DispatcherPriority.Normal,

        (Action)delegate

        {

            // here we are in the context of the UI thread

        });

}


查看完整回答
反對 回復 2021-06-05
  • 2 回答
  • 0 關注
  • 152 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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