C# 为什么这个参数是空的?
你好,我有一个关于上两个函数的问题 在函数“client.BeginConnect”中,为什么ConnectCallback的参数为空?C# 为什么这个参数是空的?,c#,C#,你好,我有一个关于上两个函数的问题 在函数“client.BeginConnect”中,为什么ConnectCallback的参数为空? ConnectCallback函数具有参数(IAsyncResult ar)。但是BeginConnect不调用此参数。。谁能回答我的问题?BeginConnect方法要求将委托引用作为第二个参数传递,该参数将在异步任务完成时调用。如果您为ConnectCallback指定了一个参数,那么它将作为方法调用进行计算,结果将是void(因为它是一个void方法),
ConnectCallback函数具有参数(IAsyncResult ar)。但是BeginConnect不调用此参数。。谁能回答我的问题?
BeginConnect
方法要求将委托引用作为第二个参数传递,该参数将在异步任务完成时调用。如果您为ConnectCallback
指定了一个参数,那么它将作为方法调用进行计算,结果将是void
(因为它是一个void方法),因此您的代码不会编译
换句话说,如果您有这样一种方法:
public static void Connect(EndPoint remoteEP, Socket client) {
client.BeginConnect(remoteEP,
new AsyncCallback(ConnectCallback), client );
connectDone.WaitOne();
}
private static void ConnectCallback(IAsyncResult ar) {
try {
// Retrieve the socket from the state object.
Socket client = (Socket) ar.AsyncState;
// Complete the connection.
client.EndConnect(ar);
Console.WriteLine("Socket connected to {0}",
client.RemoteEndPoint.ToString());
// Signal that the connection has been made.
connectDone.Set();
} catch (Exception e) {
Console.WriteLine(e.ToString());
}
}
然后,获取对DoStuff
的引用之间存在差异:
void DoStuff(int parameter)
{ ... }
传递给异步方法的委托称为“回调”,因为异步方法应该在完成其工作后调用它们。在这种情况下,传递给回调委托的实际参数是从异步方法传递的,或者是由该方法创建的,或者是您自己之前提供的
在BeginConnect
的情况下,您还将传递一个state
参数,该参数是将传递给回调的实际参数,这意味着Socket.BeginConnect
在引擎盖下执行类似于此的功能:
// this will simply evaluate DoStuff
DoStuff(7);
回调方法的职责是对传递的参数调用EndInvoke
,以完成操作
此模式允许调用代码继续执行并接收通知,使用有关实际调用它的人的所有必要信息(“状态”)
AsyncCallback
是一个委托,它将执行回调方法,该方法的参数为IAsyncResult
。你可以看到描述。因此,基本上,您需要提供一个接受IAsyncResult
作为参数的方法,以便AsyncCallback
委托可以调用它,在您的ConnectCallback
方法中,我假设AsyncCallback
在完成后接受方法调用的委托。它将调用方法ConnectCallback
并传递它生成的IAsyncResult
。在完成异步操作后,它将调用ConnectCallback
方法并传递生成的IAsyncResult
,其中包含有关此特定异步操作的信息。在您的案例中,它还包含参数client
,该参数被指定为AsyncState
。
// this will simply evaluate DoStuff
DoStuff(7);
void BeginConnect(EndPoint remoteEP, AsyncCallback callback, object state)
{
// create an async task and return to called immediately
Task.Run(() =>
{
// do some stuff on a background thread
....
// call `callback` when done, and pass the `state` parameter
// through the `IAsyncResult` parameter
var result = new ConnectAsyncResult(..., state, ...);
callback(result);
});
}