今天我們在課堂上學習多線程,並且遇到了一個非常奇怪的錯誤。在我們的新線程中執行for循環時,for循環的上界不斷獲得通過。該線程正在被殺死,但接着會出現另一個值並結束另一個線程。For循環多線程傳遞上限
爲了調試錯誤,我將上限改爲90以避免進度條上出現OutOfRange異常。
將計數器輸出到進度條並更新進度條時,我在輸出窗口中獲得了該值。
如果我註釋掉的更新進度條(pbLoad.Value = i;
)對我在輸出窗口得到這個
我曾試圖改變環路i<101
,也試圖移動i++
是但沒有區別
編輯:這是來自BeginInvoke
。當我切換到Invoke
它工作,但然後嘗試使用取消按鈕時,我會得到一個死鎖。
下面是代碼:
public partial class Form1 : Form
{
Thread backgroundThread;
bool stopExecution = false;
public Form1()
{
InitializeComponent();
}
private void btnStart_Click(object sender, EventArgs e)
{
stopExecution = false;
btnStart.Enabled = false;
backgroundThread = new Thread(DoDomethingThatTakesAWhile);
backgroundThread.Start();
}
private void DoDomethingThatTakesAWhile()
{
for (int i = 0; i <= 100; i++)
{
if (!stopExecution)
{
Thread.Sleep(100);
if (pbLoad.InvokeRequired)
{
MethodInvoker myMethod
= new MethodInvoker(
delegate
{
if (!stopExecution)
{
pbLoad.Value = i;
Debug.WriteLine(i); //i to output window
}
});
pbLoad.BeginInvoke(myMethod);
}
else
{
pbLoad.Value = i;
}
}
else
{
break;
}
}
}
private void btnCancel_Click(object sender, EventArgs e)
{
//backgroundThread.Abort();
stopExecution = true;
backgroundThread.Join();
pbLoad.Value = 0;
btnStart.Enabled = true;
}
}
聽起來像是競態條件,在循環完全結束處理之前線程正在遞增值。 – Pseudonym
該值只在該線程中被修改和訪問。 –