2014-01-07 65 views
0

我是初學者在C#中,功能調用線程

一個在此主題我調用一個函數與一個DataGridView

void PollPrint() 
{ 
    (some code) 
    printausfueren(); 
    (some code) 
} 

public void printausfueren() 
{ 
    (some Code) 
    object[] row = { sqlReader[0], sqlReader[1], sqlReader[3], sqlReader[2], sqlReader[4], sqlReader[5], sqlReader[6], sqlReader[7] }; 
    dataGridViewPrint.Rows.Add(row); 
    (some Code) 
} 

但我can'啓動一個新線程

pollprintthread = new System.Threading.Thread(PollPrint); 
pollprintthread.Start(); 

t使用printausfuheren()。invoke,我發現任何教程,但只有靜態方法

請幫助:)

+0

這是什麼UI框架? Windows窗體? – nvoigt

+0

printausfueren在工作線程上執行,並且您正在訪問其中的UI元素。 – terrybozzio

+0

是的,它的Windows窗體。 – ovonel

回答

0

您可以輕鬆地使用匿名方法來做複雜所調用,如:

yourForm.Invoke((MethodInvoker) delegate() { dataGridViewPrint.Rows.Add(row); }); 

這將自動神奇地捕捉row實例等

+0

這段代碼不會編譯(我希望它會)。你得到這個:「不能轉換lambda表達式來鍵入'System.Delegate',因爲它不是委託類型」。不幸的是,你必須使語法更加簡單:http://stackoverflow.com/a/2367763/67038 – JMarsch

+1

@JMarsch我已經更新了答案最簡單的方法:) – Luaan

2

您可以在這裏找到一個很好的解釋:https://stackoverflow.com/a/12179408/67038

但是,我建議您將調用包裝到方法中的dataGridViewPrint.Rows.Add中,然後調用該方法。

您會想要這樣做,因爲在添加這些行時,可能會在用戶界面上執行其他操作。

例如,如果要添加很多行,你會想打電話電網BeginEdit/EndEdit中,使之不會嘗試重新繪製自己爲添加的每一行:

public void printausfueren() 
{ 
    //(some Code) 
    object[] rows = { sqlReader[0], sqlReader[1], sqlReader[3], sqlReader[2], sqlReader[4], sqlReader[5], sqlReader[6], sqlReader[7] }; 
    dataGridViewPrint.Invoke(new Action(() => LoadGrid(rows))); 
    //(some Code) 
} 

private void LoadGrid(object[] rows) 
{ 
    // only need BeginEdit/EndEdit if you are adding many rows at a time 
    dataGridViewPrint.BeginEdit(false); 
    dataGridViewPrint.Rows.Add(rows); 
    dataGridViewPrint.EndEdit(); 
}