Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 匿名方法和异步I/O_C#_Asynchronous_Anonymous Methods - Fatal编程技术网

C# 匿名方法和异步I/O

C# 匿名方法和异步I/O,c#,asynchronous,anonymous-methods,C#,Asynchronous,Anonymous Methods,有人能告诉我,如果我在异步I/O中使用匿名方法,是否会遇到意外行为 例如: Action<Socket> acceptedHandler = DoAccept SocketAsyncEventArgs e = new SocketAsyncEventArgs(); e.Completed += ((sender, ea) => acceptedHandler(ea.AcceptSocket)); // Server is a Socket if (!Server.Accep

有人能告诉我,如果我在异步I/O中使用匿名方法,是否会遇到意外行为

例如:

Action<Socket> acceptedHandler = DoAccept
SocketAsyncEventArgs e = new SocketAsyncEventArgs();

e.Completed += ((sender, ea) => acceptedHandler(ea.AcceptSocket));

// Server is a Socket
if (!Server.AcceptAsync(e))
    acceptedHandler(e);
Action acceptedHandler=DoAccept
SocketAsyncEventArgs e=新的SocketAsyncEventArgs();
e、 已完成+=((发送方,ea)=>acceptedHandler(ea.AcceptSocket));
//服务器是一个套接字
如果(!Server.acceptsync(e))
接受处理程序(e);

这同样适用于BeginXXX/EndXXX异步I/O。

使用匿名方法时,无需担心。你的例子实际上是一个很好的例子,说明了何时使用它们。切记正确使用SocketAsyncEventArgs类。我希望您的示例非常做作。

从您粘贴的代码片段来看,似乎没有任何问题。唯一需要担心匿名方法的是在捕获变量时。

什么是“切记正确使用Socket AsyncEventArgs类”?它不是人为的,但它是简化的。您确实需要将SocketAsyncEventArgs声明为外部类的成员,以便可以正确地处理它。我重用了SocketAsyncEventArgs,所以我不想处理它。我知道,但如果您想优雅地关闭服务器,最终仍然需要处理它。确实。。。我想的更多的是当你引用变量时,这些变量有可变的对象,比如列表等等。如果您稍后更改acceptedHandler的值,并且触发了偶数,那么您将调用它在该点引用的任何对象,而不是原始的DoAccept。好的,在本例中,SocketAsyncEventArgs不是可变的吗?特别是因为它可以被重用,并且您可以有多个待处理的接受?当然。。。如果更改acceptedHandler指向的对象,然后触发事件,则会得到不同的行为。这完全取决于您是否要在该范围内更改acceptedHandler。很难说只有几行代码会发生什么。如果上面的代码是用大括号括起来的,那么就不必担心了。