我有一個 WinForm 應用程式,當我按下“構建”時,它會在不同的執行緒中啟動一個函式:
Thread m_SearchingThread;
private void buttonBuild_Click(object sender, EventArgs e)
{
Engine.BuildRPCDBStatusUpdate = Engine_BuildDBStatusUpdate;
// Saves the thread as class member
Thread m_SearchingThread = new Thread( o => Engine.BuildDataBase(textBoxFolderForSearch.Text));
m_SearchingThread.Start();
}
雖然該功能仍在運行,但我還有其他名為“停止”的按鈕,當我按下它時,它應該停止執行緒功能:
private void buttonStop_Click(object sender, EventArgs e)
{
if (m_SearchingThread != null)
{
m_SearchingThread.Abort();
}
}
但是在我按下“停止”按鈕后,成員m_SearchingThread為空,執行緒仍在運行。
怎么會這樣?
我對其進行了除錯,發現當我將新執行緒分配給 時m_SearchingThread,它不為空。
編輯:
我試圖取消它但CancellationToken沒有成功:
CancellationTokenSource cts = new CancellationTokenSource();
private void buttonBuild_Click(object sender, EventArgs e)
{
...
ThreadPool.QueueUserWorkItem(s =>
{
CancellationToken token = (CancellationToken)s;
if (token.IsCancellationRequested)
return;
Engine.BuildDataBase(textBoxFolderForSearch.Text);
token.WaitHandle.WaitOne(1000);
}, cts.Token);
}
private void buttonStop_Click(object sender, EventArgs e)
{
cts.Cancel();
}
uj5u.com熱心網友回復:
您正在設定區域變數 m_SearchingThread 而不是外部變數 m_SearchingThread。你有兩個不同的變數。洗掉“Thread m_SearchingThread = new Thread...”中的“Thread”
Thread m_SearchingThread;
private void buttonBuild_Click(object sender, EventArgs e)
{
Engine.BuildRPCDBStatusUpdate = Engine_BuildDBStatusUpdate;
// Saves the thread as class member
/*Thread */m_SearchingThread = new Thread( o => Engine.BuildDataBase(textBoxFolderForSearch.Text));
m_SearchingThread.Start();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/444175.html
上一篇:Svelte:為什么DOM元素屬性(offsetHeight、scrollHeight等)在beforeUpdate中有效?
