簡體   English   中英

使用WPF應用程序的UI線程對UI元素執行長時間的處理任務,還可以在同一窗口上更新進度條

[英]Use the UI thread of a WPF application to do a long processing task on a UI element, but also update a progress bar on the same window

我的程序由一個大型圖形UI控件組成,我不時需要花費大約15秒鍾重新加載一次。 因為更新代碼主要與UI控件一起工作(也許其中90%實際上是在控件上設置屬性),所以實際上讓UI線程來處理它對我來說很有意義。 我真的不希望控件在從UI加載到單獨的線程中時以視覺方式重新繪制。

我還希望更新進度條,該進度條也位於同一應用程序窗口的狀態欄中。 在這種情況下,是否有辦法打破規則並僅重新繪制進度條,還是應該只打開一個新的應用程序窗口以使進度條存在?

在這種情況下,您會怎么做?

如果可以分多個步驟完成主要任務(即更新圖形),則可以將每個步驟作為單獨的調度程序消息執行。 這將允許處理其他消息,包括使您能夠更新進度信息。

基本模式是:

  1. 調用您的主要任務,為該步驟傳遞零。
  2. 執行該步驟。
  3. 如果還有更多步驟,請在另一條消息中排隊,傳入步驟+ 1。

然后,您可以在代碼中的適當位置添加正在進行的更新。

PS。 不要說這是您最好的選擇-在不知道所有細節的情況下很難說出來。 但這是一個選擇。

應用程序中只有一個UI線程並不是真的,只是大多數Windows應用程序僅在一個線程中創建UI對象,因此該線程成為應用程序中的“ the” UI線程。 原因很容易理解-這使代碼更易於理解,並保護我們免受控件之間的隱式線程綁定問題的影響。

如果證明不可能提高控件的更新速度(這是我首先建議做的事情),則這建議一個可行的想法。 在單獨的線程上創建UI控件。 您需要確保該線程適用於UI, 也就是說該線程模型是STA ,並且它將在不破壞控件之前泵送消息並且不會死亡。 我不知道您是否還需要在UI線程中創建父窗口,還是僅在控件中創建父窗口,但是在這里值得嘗試。

查找更有效的圖形UI控件。 除非UI線程屈服於消息循環,否則其他任何更新都不會發生(這會減慢圖形控件的更新速度)。

我建議在新窗口中使用進度條(不包含表單標題)。 通過讀取圖形控件的共享屬性,使其繪制進度條。 這樣,您可以避免線程阻塞(加載緩慢)。它可以為您帶來良好的視覺體驗(兩個控件上的漸進繪畫)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM