Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.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# 为什么这个参数是空的?_C# - Fatal编程技术网

C# 为什么这个参数是空的?

C# 为什么这个参数是空的?,c#,C#,你好,我有一个关于上两个函数的问题 在函数“client.BeginConnect”中,为什么ConnectCallback的参数为空? ConnectCallback函数具有参数(IAsyncResult ar)。但是BeginConnect不调用此参数。。谁能回答我的问题?BeginConnect方法要求将委托引用作为第二个参数传递,该参数将在异步任务完成时调用。如果您为ConnectCallback指定了一个参数,那么它将作为方法调用进行计算,结果将是void(因为它是一个void方法),

你好,我有一个关于上两个函数的问题 在函数“client.BeginConnect”中,为什么ConnectCallback的参数为空?
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);
    });
}