Geo*_*kos 10 c# lambda tcp exception .net-3.5
奇怪的一个,我还没有得到,是这样的:
说,
try
{
stateClient.Socket.BeginSend(messagePrefixed, 0, messagePrefixed.Length,
SocketFlags.None, ar => stateClient.Socket.EndSend(ar), stateClient);
}
catch (SocketException ex)
{
// Handle SocketException.
}
catch (ObjectDisposedException ex)
{
// Handle ObjectDisposedException.
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么ObjectDisposedException没有捕获返回的lambda表达式!?我正在深入研究lambdas,我无法理解它.是关于lambda的范围吗?范围变量?线程问题?我知道lambda本质上没有多线程,但是你可以看到返回来自另一个创建的线程BeginSend.在将实现转换为lambda之前,当我有一个AsyncCallBack方法来处理时,这是可以的EndSend.
任何帮助赞赏.先感谢您.
Mar*_*ann 17
你是正确的,lamdas没有固有的异步性或内置多线程,但Socket.BeginSend确实如此.
会发生什么是try块封装了对BeginSend的调用.如果该调用成功,则抛出异常并且无论其他线程发生什么,封闭方法都会返回.
如果在调用BeginSend期间发生异常,则将调用catch块.
但是,lambda表达式是一个异步回调函数,所以直到稍后才会调用它.这发生在单独的线程上的单独的callstack中,因此try块在那里不起作用.
如果要对回调进行错误处理,则需要在回调本身内(即在lambda内)指定它.
它与lambdas无关.BeginSend调用的委托在另一个线程上执行,因此异常不会在具有catch语句的线程上抛出,因此它是未处理的.将您的异常处理与代码一起放置EndSend.
有关更多信息,请参阅http://msdn.microsoft.com/en-us/library/38dxf7kt.aspx
| 归档时间: |
|
| 查看次数: |
5213 次 |
| 最近记录: |