首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STA线程异常传播

STA线程异常传播
EN

Stack Overflow用户
提问于 2011-05-03 05:25:52
回答 3查看 1.9K关注 0票数 3

我有一个必须作为STA运行的函数,我想将它的异常传播给调用线程。这就是它:

代码语言:javascript
复制
public void ExceptionBePropagatedThroughHere()
{
  Thread thread = new Thread(TheSTAThread);
  thread.SetApartmentState(ApartmentState.STA);
  thread.Start();
  thread.Join();
}

public void MainFunction()
{
  try
  {
    ExceptionBePropagatedThroughHere();
  }
  catch(Exception e)
  {
     //will not hit here
  }
}

将STA属性放在"MainFunction“上在这里不是一个选项。我注意到如果我使用的是Task,try catch on task join会将异常传播到调用线程,但是我不能指定run a task as STA。

问题是如何将作为STA运行的异常传播到示例ablove中的"MainFunction“?

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-03 08:32:58

我遵循了Hans的建议,解决方案如下所示,不需要触发任何事件。

代码语言:javascript
复制
private Exception _exception;
public void ExceptionBePropagatedThroughHere()
{
  Thread thread = new Thread(TheSTAThread);Thread thread = new Thread(TheSTAThread);
  thread.SetApartmentState(ApartmentState.STA);
  thread.Start();
  thread.Join();
  if(_exception != null)
    throw new Exception("STA thread failed", _exception);
}

private void TheSTAThread()
{
  try
  {
    //do the stuff
  }
  catch (Exception ex)
  {
    _exception = ex;
  }
}
public void MainFunction()
{
  try
  {
    ExceptionBePropagatedThroughHere();
  }
  catch(Exception e)
  {
     //will not hit here
  }
}
票数 4
EN

Stack Overflow用户

发布于 2011-05-03 05:33:09

您需要在等待期间保持消息泵启动并运行。Thread.Join不是您可以使用的选项,因为它会阻塞您的线程,直到另一个线程终止。一个非常简单的消息泵是创建两个名为StaThreadExited和StaThreadExceptionEvent的事件。您可以在事件数组上使用WaitHandle.WaitAny。如果它是一个异常事件,你可以从一个共享变量中获取它,然后在你自己的线程中重新抛出它。前段时间我甚至在这里发布了code

你的,阿洛伊斯·克劳斯

票数 0
EN

Stack Overflow用户

发布于 2011-05-03 07:44:01

不管线程是STA还是MTA。其中一个未捕获的异常将使您的应用程序崩溃。您不能将它抛给创建错误线程的线程,除非您设计了一种手动执行此操作的方法:例如捕获、将其存储在某个位置,并通知主线程存在错误

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5862655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档