Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可以设置多个线程吗?_C#_Multithreading - Fatal编程技术网

C# 可以设置多个线程吗?

C# 可以设置多个线程吗?,c#,multithreading,C#,Multithreading,我正在考虑使用这段代码来检测线程是否是主(UI)线程 当运行任务的工作线程返回false时,它显然可以正常工作,只是想知道它是否通常是真的 如果相关的话,这是一个WPF应用程序 这与我的另一个问题类似:但没有人建议此解决方案。是的,您可以在创建其他线程时在其上设置STA。线程池线程位于MTA中。是的,您可以在创建其他线程时在其上设置STA。线程池线程位于MTA中。是的,您可以有多个线程。但不能在线程之间交换框架元素,这仍然会导致错误。这意味着您不能创建textbox控件并将其填充到工作线程(也是

我正在考虑使用这段代码来检测线程是否是主(UI)线程

当运行任务的工作线程返回false时,它显然可以正常工作,只是想知道它是否通常是真的

如果相关的话,这是一个WPF应用程序


这与我的另一个问题类似:但没有人建议此解决方案。

是的,您可以在创建其他线程时在其上设置STA。线程池线程位于MTA中。

是的,您可以在创建其他线程时在其上设置STA。线程池线程位于MTA中。

是的,您可以有多个线程。但不能在线程之间交换框架元素,这仍然会导致错误。这意味着您不能创建textbox控件并将其填充到工作线程(也是STA)中,然后将其传递给主线程(也是STA)并将其添加到表单中。这仍然会导致错误。因此,问题是,为什么要将多个线程设置为STA?

是的,您可以让多个线程具有STA单元。但不能在线程之间交换框架元素,这仍然会导致错误。这意味着您不能创建textbox控件并将其填充到工作线程(也是STA)中,然后将其传递给主线程(也是STA)并将其添加到表单中。这仍然会导致错误。因此,问题是,为什么要将多个线程设置为STA?

根据STAThreadAttribute的文档,不能有多个STA线程(除非使用COM互操作,否则甚至不能有一个真正的STA线程)

“将此属性应用于入口点方法(C#和Visual Basic中的Main()方法)。它对其他方法没有影响。”

由于.NET2.0,单线程单元仅用于执行COM互操作

“COM线程模型仅适用于使用COM互操作的应用程序。在不使用COM互操作的应用程序中使用此属性无效。”

在.NET Framework 2.0版中,如果新线程在启动前未设置其单元状态,则将其初始化为ApartmentState.MTA。默认情况下,主应用程序线程初始化为ApartmentState.MTA


参考:

根据STAThreadAttribute的文档,不能有多个STA线程(除非您使用COM互操作,否则您甚至不能真正拥有一个STA线程)

“将此属性应用于入口点方法(C#和Visual Basic中的Main()方法)。它对其他方法没有影响。”

由于.NET2.0,单线程单元仅用于执行COM互操作

“COM线程模型仅适用于使用COM互操作的应用程序。在不使用COM互操作的应用程序中使用此属性无效。”

在.NET Framework 2.0版中,如果新线程在启动前未设置其单元状态,则将其初始化为ApartmentState.MTA。默认情况下,主应用程序线程初始化为ApartmentState.MTA


参考资料:

我不想。我只想要一种检测主线程的方法。如果多线程设置STA的可能性很低/很少见,那么这可能就足够了。我不想这样做。我只想要一种检测主线程的方法。如果多个线程设置STA的可能性很低/不常见,那么这可能就足够了。但除非我明确这样做,否则就不会出现多个线程都是STA的情况。如果您控制应用程序中的所有线程创建,那么您是正确的,只有主线程是STA-默认为MTA的.NET中的线程。如果你正在托管任何COM组件,或者你正在使用一个这样的库,你可能会得到你不知道的STA线程。调度程序上是否有一些东西可以让你更可靠地检测到这一点?是的,将当前线程调度程序与主线程调度程序的缓存引用进行比较似乎是前进的方向。但除非我明确地这样做,那么就不会有多个线程是STA?如果你控制应用程序中的所有线程创建,那么你是正确的,只有主线程是STA-默认为MTA的.NET中的线程。如果您托管任何COM组件,或者您使用的是一个托管COM组件的库,那么您可能最终会使用您不知道的STA线程。调度程序上是否有一些东西可以让您更可靠地检测到这一点?是的,将当前线程调度程序与缓存引用与主线程调度程序进行比较似乎是前进的方向。
public static bool IsMainThread()
{
    return Thread.CurrentThread.GetApartmentState() == ApartmentState.STA;
}