因此,我的表單中的進度條為“Marquee”樣式,因此它應該持續運行,但是當我單擊按鈕以顯示進度時,它會凍結并且不會移動,但是如果我不隱藏進度條一開始它會正常運行。
我只希望它在單擊按鈕時出現,對此有什么想法嗎?
public Form1()
{
InitializeComponent();
progressBar1.Hide();
}
private void button1_Click(object sender, EventArgs e)
{
progressBar1.Show();
DrawingHandler MyDrawingHandler = new DrawingHandler();
MyDrawingHandler.GetConnectionStatus();
try
{
Operation.RunMacro("shaftCheck.cs");
DrawingEnumerator SelectedDrawings = MyDrawingHandler.GetDrawingSelector().GetSelected();
if (SelectedDrawings.GetSize() == 0)
{
MessageBox.Show("Error, no drawings to export.");
}
else
{
Operation.RunMacro("ExportShaft2.cs");
}
}
catch (Exception)
{
MessageBox.Show("Error");
}
}
}
uj5u.com熱心網友回復:
最可能的原因是您在 UI 執行緒上進行了某種緩慢的操作。
大多數情況下只有一個 UI 執行緒,這是唯一允許更新 UI 的執行緒,并且一次只能做一件事。如果您使用 UI 執行緒進行某種處理,則它無法執行其他操作,例如更新您的 UI。
解決方案是將所有處理密集型操作放在后臺執行緒上。例如使用Task.Run。但是您需要確保任何被呼叫的代碼都不會觸發任何 UI 更新。
如果您只有一個進度條作為對話框的一部分,那就很容易了。但這會導致用戶在您進行處理時可以做其他事情,因此您需要非常小心,確保您的所有代碼都是執行緒安全的。
更安全的選擇通常是顯示一個模態對話框,以防止用戶執行任何其他操作。這大大降低了執行緒安全問題的風險。通常它看起來像這樣:
var progressForm = new MyProgressForm();
Task.Run(MyWorkerMethod)
.ContinueWith(t => progressForm.DialogResult = DialogResult.OK, TaskScheduler.FromCurrentSynchronizationContext());
progressForm .ShowDialog();
uj5u.com熱心網友回復:
進度條中是否有另一個更適合您需求的屬性。Winforms Progress Bar Visible在這篇文章中為true false看起來您可以使用 Visibility 屬性更改可見性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/359808.html
