簡體   English   中英

C#進度條不合作

[英]C# Progress Bar not cooperating

我遇到了一個非常奇怪的情況。 這應該是如此簡單,但我不確定為什么會這樣。

我將一個選取框進度條設置為visible = false,因為它是初始狀態。 然后在運行期間的某個時刻,我調用我的一個函數,然后在調用它之前將PB設置為visible = true,在函數結束后,我將其設置為visible = false。 它沒有變得更簡單。

If (something)
{
  pb.visible=true;
  runMyfunction(x, x, x, x,);
  pb.visible=false;
}

問題是我從未見過PB。 如果我注釋掉我的函數並刪除= false,則會顯示PB,但只要我恢復了我的功能,PB就不會出現。

我嘗試了各種方法。 使用If語句確保我在觸摸函數之前得到一個進度條,它仍然保持PB隱藏。

我錯過了什么嗎? 這似乎不應該是如此復雜。 顯示對象,運行函數,隱藏對象。 對? :)

這是因為您的功能正在占用UI線程。 將ProgressBar設置為可見需要釋放UI線程以繪制它,而是繼續處理您的函數,從而沒有時間繪制。

您可以通過調用以下方法解決此問題: Application.DoEvents停止處理您的方法足夠長的時間來處理一些Windows消息(並執行相關的繪圖)。

Application.DoEvents的一個大問題是假設你從runMyfunction()更新你的進度條,你將不得不經常調用Application.DoEvents來允許你的PB繪制,或者你會看到它,但你永遠不會看到它更新。

更好的解決方案是將runMyfunction()調用推runMyfunction()后台線程,並從那里異步更新進度條。 當然,這更復雜,但可以帶來更好的用戶體驗。

我的猜測是myRunFunction()在UI線程上運行。

嘗試在BackgroundWorker中運行它並在調用RunWorkerAsync之前啟動ProgressBar並在RunWorkerCompleted事件中將其停止。

用代碼示例編輯:

public class SomeClass
{
    private BackgroundWorker _myFunctionBackgroundWorker;
    private SomeProgressBar pb;

    public SomeClass()
    {
        _myFunctionBackgroundWorker = new BackgroundWorker();
        _myFunctionBackgroundWorker.DoWork += myFunctionBackgroundWorker_DoWork;
        _myFunctionBackgroundWorker.RunWorkerCompleted += myFunctionBackgroundWorker_RunWorkerCompleted;

        pb.visible = true;
        _myFunctionBackgroundWorker.RunWorkerAsync();
    }

    private void myFunctionBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        runMyfunction();
    }


    private void myFunctionBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        pb.visible = false;
    }
}

runMyFunction()方法內部調用Application.DoEvents()來強制你的應用重繪並處理windows消息循環:

例如

void myRunFunction()
{
  while (someFlag)
  {
   // do work
   pb.Value = someValue;
   Application.DoEvents();
  }
}

可能是您的功能正在運行並且完成得太快,您無法查看該欄。 我知道我之前已經發生了幾次這種情況。

暫無
暫無

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

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