如何从C#中的线程访问非静态方法

mon*_*guy 2 c# multithreading

我不确定这是否是一个好的编程礼仪,无论如何我有一个常规的方法,我更新某些数据和UI元素,如文本块等.

无论如何,我想创建一个线程,每X个Seconds运行更新方法,但我无法访问它,因为据我所知,线程只能运行静态方法.

围绕这个最好的方法是什么?

谢谢,

毫克.

Mar*_*ers 9

据我所知,一个线程只能运行静态方法.

这是不正确的.你可以像这样开始一个线程:

Thread thread = new Thread(() => { foo.bar(123, 456); });
thread.Start();
Run Code Online (Sandbox Code Playgroud)

方法栏不必是静态的,但您需要引用一个对象才能调用实例方法.

如果您有无参数方法,您也可以这样做:

Thread thread = new Thread(bar);
Run Code Online (Sandbox Code Playgroud)

您应该注意,您不能从主线程之外的其他线程修改GUI,因此如果您只想更新GUI,则不应该启动新线程.如果您有一个长时间运行的进程并希望偶尔更新GUI以显示进度而不阻止UI,则可以查看BackgroundWorker.

或者,您可以使用Invoke模式从后台线程更新GUI:

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

请参阅此相关问题:C#:自动调用InvokeRequired代码模式