3 回答

TA貢獻1790條經驗 獲得超9個贊
嘗試 或 代替 。await Task.Delay(10);
await Dispatcher.BeginInvoke(new Action(() => { }), System.Windows.Threading.DispatcherPriority.Input);
Dispatcher.Yield
這應該使 UI 線程有機會在執行循環時進行呈現。

TA貢獻1827條經驗 獲得超8個贊
或者無論你在哪個線程上運行,都有效的奇怪的怪物:
await Task.Run(() =>
{
Action action = () => { };
MainWindow.Dispatcher.Invoke(action,
System.Windows.Threading.DispatcherPriority.Background);
});
Dispatcher.Yield()在 UI 線程上工作正常。但它是一個靜態方法,在 上運行,并且沒有等效的非靜態成員。Dispatcher.CurrentDispatcher

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
在接受的答案中提出的其他想法也會起作用,但與簡單地屈服于正確請求的延續優先級相比,它們有點笨拙。
- 3 回答
- 0 關注
- 172 瀏覽
添加回答
舉報