我正在使用ThreadPool來管理我的線程。與UI線程分開,我有一個線程執行數據檢索和一般工作操作,並且我有第三個線程更新UI以反映請求的操作的狀態。下面爲什麼我的多線程應用程序沒有做它應該做的事情?
見代碼:
// ui thread
private void btnLoadClients_Click(object sender, EventArgs e)
{
// start thread 1
ThreadPool.QueueUserWorkItem(new Form1().LoadClientList);
}
// thread 1
private void LoadClientList(object state)
{
ThreadBusy = true;
ThreadAction = "Loading Clients...";
// start thread 2
ThreadPool.QueueUserWorkItem(new Form1().ShowProgress);
// get data
ClientController c = new ClientController();
List<Client> clients = c.GetClient();
foreach (Client item in clients)
{
cmbClientList.Items.Add(item.Name);
}
cmbClientList.Items.Insert(0, "Please select a client");
ThreadBusy = false;
}
// thread 2
private void ShowProgress(object state)
{
while (ThreadBusy)
{
foreach (string action in lstAction.Items)
{
// write the action that's being taken to the listbox
if (String.Compare(action, ThreadAction) != 0)
lstAction.Items.Add(ThreadAction);
}
}
}
問題是,雖然當我設置一個斷點它ShowProgress正在熱播,執行不進入它真的。 while (ThreadBusy)
線路不會被擊中。
我在這裏有什麼問題嗎?
使用'delegates'從其他線程UI線程更新的東西。 – Neijwiert
只需使用BackgroundWorker。它專門設計用來做到這一點。或者使用'Task'和'await'。 – Servy
@Neijwiert他*使用委託,他只是沒有使用正確的操作來編組到UI線程,他也沒有做正確的事情,我這個方法做他想做的事情,即使他們在UI線程中運行。 – Servy