2010-08-14 29 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

相关问题