我有一个必须作为STA运行的函数,我想将它的异常传播给调用线程。这就是它:
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“?
提前谢谢。
发布于 2011-05-03 08:32:58
我遵循了Hans的建议,解决方案如下所示,不需要触发任何事件。
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
}
}发布于 2011-05-03 05:33:09
您需要在等待期间保持消息泵启动并运行。Thread.Join不是您可以使用的选项,因为它会阻塞您的线程,直到另一个线程终止。一个非常简单的消息泵是创建两个名为StaThreadExited和StaThreadExceptionEvent的事件。您可以在事件数组上使用WaitHandle.WaitAny。如果它是一个异常事件,你可以从一个共享变量中获取它,然后在你自己的线程中重新抛出它。前段时间我甚至在这里发布了code。
你的,阿洛伊斯·克劳斯
发布于 2011-05-03 07:44:01
不管线程是STA还是MTA。其中一个未捕获的异常将使您的应用程序崩溃。您不能将它抛给创建错误线程的线程,除非您设计了一种手动执行此操作的方法:例如捕获、将其存储在某个位置,并通知主线程存在错误
https://stackoverflow.com/questions/5862655
复制相似问题