0

次のようなコードを実行する関数があります。

Protected void XXXXfunc()
{
  //i register a callback for asynchronous operation below is just an example
  // not true to its operation 
  byte[] buffer = new byte[10];

  s.BeginReceive(buffer, 0, 10, SocketFlags.None,
      new AsyncCallback(OnMessageReceived), buffer);
}

// Callback function
XXXX callback OnMessageReceived(XXXX)
{
  //Something Goes wrong here i throw an exception 
  throw(exception);
}

この例外をどこでどのようにキャッチするか、またはこの例外をどこでキャッチするか。

4

1 に答える 1

1

コールバックでは、あなたがそれを捕まえることができる唯一の場所。

そして、はい、それは非常に厄介な場所です。なぜなら、そのコールバックは、開始していないスレッドで実行され、残りのコードから完全に非同期で実行されるからです。プログラムのメインロジックに、問題が発生したことと、修正措置を講じる必要があることを何らかの方法で通知する必要があります。これには通常、メインスレッドにマーシャリングされるイベントを発生させる必要があります。少なくとも、「機能しなかった」ことをユーザーに知らせるため。

この種の問題は、C#バージョン4のTask <>クラスとC#バージョン5に追加されたasync / awaitキーワードの背後にある主な動機です。これは、ユーザーがランダムな失敗に対処するのに実際には何もしません。報告が簡単です。

于 2012-07-31T23:44:51.893 に答える