请考虑以下代码:
class Foo {
// boring parts omitted
private TcpClient socket;
public void Connect(){
socket.BeginConnect(Host, Port, new AsyncCallback(cbConnect), quux);
}
private void cbConnect(IAsyncResult result){
// blah
}
}
如果socket
在BeginConnect
返回后和cbConnect
被调用之前抛出异常,它会在哪里弹出?它甚至被允许抛出背景吗?
答案 0 :(得分:7)
来自msdn forum的异步委托的异常处理代码示例。我相信对于TcpClient模式将是相同的。
using System;
using System.Runtime.Remoting.Messaging;
class Program {
static void Main(string[] args) {
new Program().Run();
Console.ReadLine();
}
void Run() {
Action example = new Action(threaded);
IAsyncResult ia = example.BeginInvoke(new AsyncCallback(completed), null);
// Option #1:
/*
ia.AsyncWaitHandle.WaitOne();
try {
example.EndInvoke(ia);
}
catch (Exception ex) {
Console.WriteLine(ex.Message);
}
*/
}
void threaded() {
throw new ApplicationException("Kaboom");
}
void completed(IAsyncResult ar) {
// Option #2:
Action example = (ar as AsyncResult).AsyncDelegate as Action;
try {
example.EndInvoke(ar);
}
catch (Exception ex) {
Console.WriteLine(ex.Message);
}
}
}
答案 1 :(得分:4)
如果接受连接的过程导致错误,则将调用cbConnect方法。要完成连接,您需要进行以下调用
socket.EndConnection(result);
此时,BeginConnect进程中的错误将显示在抛出的异常中。