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

C# 4.0 捕获在不同线程/回调上运行的异常,c#-4.0,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 Asy

我有一个函数执行一些代码,比如

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);
}

我在何处以及如何捕获此异常,或者此异常在何处被捕获。

在回调中,您可以捕获它的唯一位置

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

这类问题是C#version 4中Task类和C#version 5中添加的async/await关键字背后的主要动机。这实际上并没有帮助用户处理随机故障,只是让报告更容易