由於我的應用程序有效,所以我沒有問題(但),但我想了解發生了什麼,所以我稍後不會遇到麻煩。 (我主要是一個數據庫/網絡應用程序員,所以線程通常不是我的東西!)調用UI線程的多個線程:表單數據需要鎖定?
簡版:用戶界面是否需要在多線程更新時鎖定表單數據?
我有掃描某些內容文件,並將結果顯示給用戶一個簡單的Winforms應用程序(使用DataGridViews)。我起初在UI線程中完成了這一切,但瞭解到這不是一個好主意,並且決定使用ThreadPool.QueueUserWorkItem來處理[ProcessorCount]項目集合。這可以正常工作,使用委託和BeginInvoke功能在發現UI時將結果發送到UI。 (儘管有時有太多的結果和UI仍然滯後,但這是另外一個問題。)
工作線程是完全隔離的,做自己的事。我理解多線程的概念,並且需要知道同時訪問共享數據。然而,我不完全清楚的是當各種線程調用UI線程來更新它時會發生什麼。只有UI會更新控件(和表單級別的變量),但由於調用來自其他線程,這是如何實現的?例如,如果我將項目添加到列表或遞增計數器,是否可以將來自一個工作線程的調用中斷另一箇中斷?每個BeginInvoke都是自己的調用,但修改數據似乎仍然可能是一個問題。的的BeginInvoke的例子
無我發現提及任何需要在用戶界面鎖定。這兩個主題相關的,但仍然不給我在尋找確切的答案:
Using Control.Invoke() in place of lock(Control)
What's the difference between Invoke() and BeginInvoke()
爲什麼你應該從單一線程進行所有UI操作:UI線程。 –