捕获异常在不同的线程/回调上运行

时间:2012-07-31 22:38:19

标签: c#-4.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);
}

我在哪里以及如何捕获此异常,或者在此异常的哪个位置被捕获。

1 个答案:

答案 0 :(得分:1)

在回调中,可以抓住它的唯一地方。

是的,这是非常尴尬的地方,因为该回调在你没有启动的线程上运行,并且与其余代码完全异步运行。你必须以某种方式让你的程序中的主要逻辑知道出错了,并且需要采取纠正措施。这通常需要引发一个被封送回主线程的事件。至少让用户知道“它不起作用”。

这类问题是Task<>背后的主要动机。 C#版本4中的类和添加到C#版本5的async / await关键字。实际上没有任何帮助用户处理随机失败的事情,它只是使报告更容易。