我不确定这是否是良好的编程礼仪,无论如何,我有一个正常的方法,其中我更新了某些数据和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