[英]STA thread exception propagation
我有一個必須作為 STA 運行的 function,我想將其異常傳播到調用線程。 這里是:
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”上不是一個選項。 我注意到如果我使用的是任務,在任務連接上嘗試捕獲會將異常傳播到調用線程,但是我不能指定將任務運行為 STA。
問題是如何將作為 STA 運行的異常傳播到上面示例中的“MainFunction”?
提前致謝。
我遵循了 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
}
}
您需要在等待時保持消息泵的啟動和運行。 Thread.Join 不是您可以使用的選項,因為它會阻塞您的線程,直到另一個線程終止。 一個非常簡單的消息泵是您創建兩個事件,稱為 StaThreadExited 和 StaThreadExceptionEvent。 您可以在事件數組上使用 WaitHandle.WaitAny。 如果它是一個異常事件,您可以從例如共享變量中獲取它並在您自己的線程中重新拋出它。 前段時間我什至在這里發布了代碼。
你的,阿洛伊斯克勞斯
不管線程是 STA 還是 MTA。 其中未捕獲的異常將使您的應用程序崩潰。 你不能把它扔給創建你行為不端的線程的線程,除非你 devise 手動這樣做的方法:比如捕獲,將它存儲在某個地方,並通知主線程有錯誤
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.