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

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

調度程序.產量優先級問題

調度程序.產量優先級問題

C#
HUX布斯 2022-09-04 16:35:19
我想在循環中更新 WPF 應用程序中某些 UI 元素的位置。每次迭代后,應重新呈現 UI 以使更改可見。更新過程可以隨時使用取消令牌停止。由于取消是由用戶執行的,因此 UI 必須保持對輸入的響應。我寫了以下方法來做到這一點:public async Task DoStuff(CancellationToken token){    do    {        DoLayoutUpdate();        await Dispatcher.Yield(DispatcherPriority.Input);    } while (!token.IsCancellationRequested);}這主要有效:UI在每次迭代后重新渲染,我可以單擊按鈕取消操作,以便輸入也有效。問題是:如果沒有輸入并且沒有要重新呈現的內容,則該方法會卡在 Yield 中。據推測,線程被阻塞,等待輸入或呈現任務。如果我將增加到 ,則該方法不會再卡住,但隨后 UI 不會更新,輸入不再被處理。DispatcherPriorityRender我該如何解決這個問題?
查看完整描述

3 回答

?
富國滬深

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

嘗試 或 代替 。await Task.Delay(10);await Dispatcher.BeginInvoke(new Action(() => { }), System.Windows.Threading.DispatcherPriority.Input);Dispatcher.Yield

這應該使 UI 線程有機會在執行循環時進行呈現。


查看完整回答
反對 回復 2022-09-04
?
慕仙森

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

或者無論你在哪個線程上運行,都有效的奇怪的怪物:


        await Task.Run(() =>

        {

            Action action = () => { };

            MainWindow.Dispatcher.Invoke(action, 

                System.Windows.Threading.DispatcherPriority.Background);

        });

Dispatcher.Yield()在 UI 線程上工作正常。但它是一個靜態方法,在 上運行,并且沒有等效的非靜態成員。Dispatcher.CurrentDispatcher


查看完整回答
反對 回復 2022-09-04
?
阿晨1998

TA貢獻2037條經驗 獲得超6個贊

如果我增加調度程序優先級以進行渲染,則該方法不會再卡住,但 UI 不會更新,輸入也不會再得到處理。


實際上,問題在于您在錯誤的方向上更改了優先級。將優先級設置為 將允許 WPF 完成其工作,然后最終安排繼續以允許方法在 之后繼續執行。DispatcherPriority.Backgroundawait


即:


public async Task DoStuff(CancellationToken token)

{

    do

    {

        DoLayoutUpdate();


        await Dispatcher.Yield(DispatcherPriority.Background);

    } while (!token.IsCancellationRequested);

}

使用較高的優先級會導致過早地安排繼續,從而為循環提供所有調度程序時間,優先于 WPF 需要執行的所有其他操作。


當然,請注意,不帶參數的調用也將默認為 using。無論哪種方式都工作正常。Dispatcher.Yield()DispatcherPriority.Background


在接受的答案中提出的其他想法也會起作用,但與簡單地屈服于正確請求的延續優先級相比,它們有點笨拙。


查看完整回答
反對 回復 2022-09-04
  • 3 回答
  • 0 關注
  • 172 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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