2010-08-14 45 views
1

我不確定這是否是良好的編程禮儀,無論如何,我有一個正常的方法,其中我更新了某些數據和UI元素的某些位,如文本塊等。如何從C#中的線程訪問非靜態方法

無論如何,我想創建一個線程,它運行更新方法每X秒量它但我無法訪問它,因爲從我所瞭解的線程只能運行靜態方法。

這是最好的方法是什麼?

謝謝,

毫克。

回答

8

從我理解的一個線程只能運行靜態方法。

這根本不是真的。您可以啓動一個線程是這樣的:

Thread thread = new Thread(() => { foo.bar(123, 456); }); 
thread.Start(); 

的方法吧不必是靜態的,但你需要有一個對象的引用可以調用一個實例方法。

如果你有一個參數的方法,你也可以這樣做:

Thread thread = new Thread(bar); 

你應該注意的是,你不能從另一個線程比主線程修改GUI,所以如果你想要做的就是更新GUI,你不應該開始一個新的線程。如果您有一個長時間運行的進程,並且想要偶爾更新GUI以顯示進度而不阻止UI,則可以查看BackgroundWorker

或者您可以更新使用該調用模式的後臺線程的GUI:

private void updateFoo() 
{ 
    if (InvokeRequired) 
    { 
     Invoke(new MethodInvoker(() => { updateFoo(); })); 
    } 
    else 
    { 
     // Do the update. 
    } 
} 

請參閱此相關的問題:C#: Automating the InvokeRequired code pattern

+0

爲什麼匿名方法?這不是nessacary:新線程(foo).Start(); – jgauffin 2010-08-14 10:01:23

+1

@jfgauffin:這是一個特殊情況,可能不適用於OP的情況。我的答案可以更普遍地使用。但是,在某些情況下,你的方法也適用。我會將其添加到我的答案。 – 2010-08-14 10:03:25

+0

感謝您的迴應馬克,但如果我去; (); public MainPage() { InitializeComponent(); new Thread(()=> {myTest();})。Start(); } void myTest() { myTextBlock.Text =「Tester。」; } 我仍然得到一個UnauthorizedAccessException? – monkeyguy 2010-08-14 10:03:55

相關問題