gpt4 book ai didi

c# - lambda 表达式的异常

转载 作者:可可西里 更新时间:2023-11-01 02:30:24 25 4
gpt4 key购买 nike

奇怪的是,我还是不明白,是这样的:

说,

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.
}

我不明白为什么没有捕获返回 ObjectDisposedException 的 lambda 表达式!?我正在深入研究 lambda,但我无法理解。是关于lambda的范围吗?范围变量?线程问题?我知道 lambda 本质上没有多线程,但正如您所见,返回来自另一个由 BeginSend 创建的线程。在将实现转换为 lambda 之前,当我有一个处理 EndSendAsyncCallBack 方法时,这是可以的。

感谢任何帮助。提前谢谢你。

最佳答案

你是正确的,lamdas 没有内在的异步性或内置多线程,但 Socket.BeginSend 有。

发生的事情是 try block 封装了对 BeginSend 的调用。如果该调用成功,则不会抛出异常并且封闭方法返回,无论其他线程发生什么。

如果在调用 BeginSend 期间发生异常,您的 catch block 将被调用。

但是,lambda 表达式是一个异步回调,因此它不会在稍后调用。这发生在单独线程的单独调用堆栈中,因此 try block 在那里无效。

如果您想对回调进行错误处理,则需要在回调本身(即 lambda 内部)中指定它。

关于c# - lambda 表达式的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1887620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com