我不確定這是否是良好的編程禮儀,無論如何,我有一個正常的方法,其中我更新了某些數據和UI元素的某些位,如文本塊等。如何從C#中的線程訪問非靜態方法
無論如何,我想創建一個線程,它運行更新方法每X秒量它但我無法訪問它,因爲從我所瞭解的線程只能運行靜態方法。
這是最好的方法是什麼?
謝謝,
毫克。
我不確定這是否是良好的編程禮儀,無論如何,我有一個正常的方法,其中我更新了某些數據和UI元素的某些位,如文本塊等。如何從C#中的線程訪問非靜態方法
無論如何,我想創建一個線程,它運行更新方法每X秒量它但我無法訪問它,因爲從我所瞭解的線程只能運行靜態方法。
這是最好的方法是什麼?
謝謝,
毫克。
從我理解的一個線程只能運行靜態方法。
這根本不是真的。您可以啓動一個線程是這樣的:
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.
}
}
如果要更新基於線程的進度UI元素,你應該看看BackgroundWorker類(http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx)
爲什麼匿名方法?這不是nessacary:新線程(foo).Start(); – jgauffin 2010-08-14 10:01:23
@jfgauffin:這是一個特殊情況,可能不適用於OP的情況。我的答案可以更普遍地使用。但是,在某些情況下,你的方法也適用。我會將其添加到我的答案。 – 2010-08-14 10:03:25
感謝您的迴應馬克,但如果我去; (); public MainPage() { InitializeComponent(); new Thread(()=> {myTest();})。Start(); } void myTest() { myTextBlock.Text =「Tester。」; } 我仍然得到一個UnauthorizedAccessException? – monkeyguy 2010-08-14 10:03:55