我仍然是C#的新手,特别是c#中的线程。我正在尝试启动一个需要单线程公寓的功能(斯塔特雷德)

但我无法编译以下代码:

该函数在一个单独的类中如下所示 MyClass:

internal static string DoX(string n, string p)
        {
            // does some work here that requires STAThread
        }

我已经尝试了函数顶部的属性[STAThread],但这不起作用。

所以我试图创建一个新的线程,如下所示:

 Thread t = new Thread(new ThreadStart(MyClass.DoX));

但是这不会编译(最好的重载方法具有无效参数错误)。然而,在线的例子非常相似 (这里的例子) 我做错了什么,我怎么能简单地让一个函数在新的STA线程中运行?

谢谢

有帮助吗?

解决方案

Thread thread = new Thread(() => MyClass.DoX("abc", "def"));
thread.SetApartmentState(ApartmentState.STA);
thread.Start();

如果您需要该值,则可以将其"捕获"回变量中,但请注意,该变量在其他线程结束之前不会具有该值:

int retVal = 0;
Thread thread = new Thread(() => {
    retVal = MyClass.DoX("abc", "def");
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();

或者更简单:

Thread thread = new Thread(() => {
    int retVal = MyClass.DoX("abc", "def");
    // do something with retVal
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top