我有一個程序會對數據庫進行一些重大調用,然後更新UI。這是造成問題的原因,因爲在大多數情況下,這意味着UI不響應。因此,我決定,我希望把訪問數據庫的函數調用和更新在一個單獨的線程的UI,所以現在我有這樣的事情:c#BeginInvoke問題
private delegate void CallAsyncDelegate();
private void CallGetDBValues()
{
// Call GetDatabaseValues in new thread
CallAsyncDelegate callGetDatabaseValues = new
CallAsyncDelegate(GetDatabaseValues);
BeginInvoke(callGetDatabaseValues);
}
private void GetDatabaseValues()
{
// Get lots of data here
// Update UI here
}
...
但是,它似乎毫無任何區別的UI。我在某處讀到,如果要在單獨的線程中運行的代碼需要更新UI,那麼這就是應該如何進行調用 - 這是正確的嗎?難道我做錯了什麼?
你明白了倒退;如果您的代碼已經在單獨的後臺線程中運行,並且您需要從中更新UI,那麼您需要使用BeginInvoke方法,該方法允許您在UI線程上執行UI更新代碼。就你而言,你已經在UI線程上執行了代碼,但是你想要在單獨的後臺線程上執行工作代碼。在這裏尋找一個建議使用BackgroundWorker組件的答案......它是一個可以添加到UI窗體以在分離線程上執行代碼的組件。 – 2010-08-02 19:34:01
您可以在BCL中使用MethodInvoker而不是定義您自己的代理 – thecoop 2010-08-02 19:39:23