簡體   English   中英

STA 線程異常傳播

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM