C# 关闭应用程序时出现跨线程异常

C# 关闭应用程序时出现跨线程异常,c#,multithreading,C#,Multithreading,关闭使用两个线程(主线程和辅助线程)的应用程序时,有时会出现跨线程异常。我认为发生的情况是,主UI线程正在被释放,而次UI线程仍在运行,并且由于次UI线程有时调用UI线程上的内容,因此它正在崩溃 是否需要在FormClosing事件中手动关闭次线程 感谢您提供的信息。多线程windows应用程序中推荐的方法是使用方法调用,而不是直接操作在另一个线程上创建的控件。这样,您就不会出现交叉线程异常。例如,您可以如下设置文本框的文本: form1.BeginInvoke(new MethodInvoke

关闭使用两个线程(主线程和辅助线程)的应用程序时,有时会出现跨线程异常。我认为发生的情况是,主UI线程正在被释放,而次UI线程仍在运行,并且由于次UI线程有时调用UI线程上的内容,因此它正在崩溃

是否需要在
FormClosing
事件中手动关闭次线程


感谢您提供的信息。

多线程windows应用程序中推荐的方法是使用
方法调用,而不是直接操作在另一个线程上创建的控件。这样,您就不会出现
交叉线程异常
。例如,您可以如下设置文本框的文本:

form1.BeginInvoke(new MethodInvoker(()=>textbox1.text = "Hello!"));
有关更多信息,请参阅:

多线程windows应用程序中推荐的方法是使用
方法调用
,而不是直接操作在另一个线程上创建的控件。这样,您就不会出现
交叉线程异常
。例如,您可以如下设置文本框的文本:

form1.BeginInvoke(new MethodInvoker(()=>textbox1.text = "Hello!"));
有关更多信息,请参阅:

一旦有了长时间运行的专用线程,就必须为其实现关闭逻辑。原因很简单:在至少有一个线程处于活动状态之前,应用程序不会被操作系统杀死。是的,没有所谓的“主线程”,从操作系统的角度来看,所有线程都是平等的

有鉴于此,一旦你的应用程序计划退出,你必须

  • 向第二个线程发送预期终止的信号
  • 等待第二个线程,直到它退出他的线程进程

  • 现在您可以自由退出了。

    一旦有了一个长期运行的专用线程,您就必须为它实现关闭逻辑。原因很简单:在至少有一个线程处于活动状态之前,应用程序不会被操作系统杀死。是的,没有所谓的“主线程”,从操作系统的角度来看,所有线程都是平等的

    有鉴于此,一旦你的应用程序计划退出,你必须

  • 向第二个线程发送预期终止的信号
  • 等待第二个线程,直到它退出他的线程进程
  • 现在你可以自由退出了

    是否需要手动关闭次线程

    不,是的

    否,如果辅助线程是后台线程。您可以检查/设置辅助线程上的属性。当不再有前台线程运行时,CLR会自动停止所有后台线程。例如,所有线程池线程都是后台线程

    是的,但是,当您在辅助线程中执行一些关键任务时,您不希望它突然停止。在这种情况下,您必须实现适当的逻辑来停止辅助线程

    是否需要手动关闭次线程

    不,是的

    否,如果辅助线程是后台线程。您可以检查/设置辅助线程上的属性。当不再有前台线程运行时,CLR会自动停止所有后台线程。例如,所有线程池线程都是后台线程


    是的,但是,当您在辅助线程中执行一些关键任务时,您不希望它突然停止。在这种情况下,您必须实现适当的逻辑来停止辅助线程

    如果您使用的是framework 4.0,请尝试使用任务,您可能会获得更好的结果。此外,您可能会发现此免费资源很有帮助。我会读的,谢谢!如果您使用的是framework 4.0,请尝试使用任务,您可能会获得更好的结果。此外,您可能会发现此免费资源很有帮助。我会读的,谢谢!我不在乎辅助线程何时停止,所以我所要做的就是将其设置为背景线程。谢谢,伙计。我不在乎第二个线程什么时候停止,所以我所要做的就是把它变成一个背景线程。谢谢你,伙计。