我一直在盯着這個線程一段時間,我相信我的思想已經關閉了。認爲要做的最好的事情,爲了更新UI TextBox
中的時間,將創建我認爲是一個簡單的線程來獲取時間並將其發佈回UI控件。在與之戰鬥了一段時間之後,我感到沮喪,並認爲我可能會以其他方式增加時間。在冒險家的勇敢精神中,我又給了它一個機會。「簡單」C#時間線程似乎凍結了
我有一個類似的線程在應用程序的其他地方運行,需要一個列表並在TabControl
中填充DataGridView
。我一直認爲這個過程大致相同,但我錯過了一個關鍵部分。線程的全部低於:
private void displayTime()
{
while (true)
{
String time;
String date;
time = DateTime.Now.TimeOfDay.ToString();
int len = time.IndexOf('.');
time = time.Substring(0, len);
date = DateTime.Now.Date.ToString();
len = date.IndexOf(' ');
date = date.Substring(0, len);
updateClock(time, date);
}
}
private void updateClock(String time, String date)
{
if (InvokeRequired)
{
BeginInvoke(new timeDel(updateClock), new object[] {time, date});
return;
}
ctrlTimeTxt.Text = time + "\n" + date;
}
以上線程在不同的地方(在試圖調試)已經啓動,但目前在窗體的Shown
事件處理程序。表格開始出現,但一切似乎都掛起了。當我在線程中放置一個斷點時,我可以無限步,但UI似乎永遠不會得到控制權。我錯過了什麼?我很樂意擴展任何被忽視的細節。
編輯:一個澄清:此線程正在開始時處理所示事件的功能。 顯示的事件的描述爲:每次首次顯示窗體時發生。我認爲這可能會消除UI線程太快調用的理論。
這似乎是它會正常工作。我不知道是否你是最初發布的嘗試Invoke()而不是BeginInvoke()(我相信這是...),但最終解決了我的問題。有沒有原因不使用Invoke()並用一個計時器來代替? – 2010-10-20 19:10:43
@Rich Hoffman:你在淹沒事件隊列。之所以使用Invoke而不是BeginInvoke工作原因是因爲它會導致線程在生成下一個事件之前等待更新表單,因此事件隊列不會失去控制。但是,如果您還嘗試在同一時間執行其他操作,那麼您仍然不必要地通過大量的事件來發送事件隊列,這可能會導致應用程序的響應問題。 – 2010-10-20 19:24:50
另一方面,定時器允許你控制事件的速度,加上你根本不需要額外的線程。這是一個更簡單的解決方案。 – 2010-10-20 19:30:14