Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.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# 如何将对象设置为AsyncState并将其传递到AsyncCallback方法_C#_Asynchronous - Fatal编程技术网

C# 如何将对象设置为AsyncState并将其传递到AsyncCallback方法

C# 如何将对象设置为AsyncState并将其传递到AsyncCallback方法,c#,asynchronous,C#,Asynchronous,两个问题: 如何将参数传递给AsyncCallback方法 如何调用AsyncCallback方法 背景如下: 我正在.NETFramework 3.5中处理一个旧项目。我想创建一个异步方法,在不阻塞当前线程的情况下执行一些工作。由于该项目是一个旧版本Async Await关键字不可用,我计划执行所有并行工作,包括一些数据库查询和AsyncCallback方法中的api调用。我知道AsyncState可以用来传递参数。因为我需要多个参数,所以我计划将这些参数包含到一个对象中,并将该对象设置为As

两个问题:

  • 如何将参数传递给
    AsyncCallback
    方法

  • 如何调用
    AsyncCallback
    方法

  • 背景如下:

    我正在.NETFramework 3.5中处理一个旧项目。我想创建一个异步方法,在不阻塞当前线程的情况下执行一些工作。由于该项目是一个旧版本Async Await关键字不可用,我计划执行所有并行工作,包括一些数据库查询和AsyncCallback方法中的api调用。我知道AsyncState可以用来传递参数。因为我需要多个参数,所以我计划将这些参数包含到一个对象中,并将该对象设置为AsyncState,这样我就可以将AsyncState转换为要在AsyncCallback方法中使用的对象。我没找到好办法。我找到了这个,但我不使用HttpWebRequest

     public Class ArgumentObject
     {
          public string A{get;set;}
          public string B{get;set;}
          ...
     }
     public void CallBack(IAsyncResult result, ArgumentObject arObj)
     {
          Console.WriteLn(arObj.A);
          Console.WriteLn(arObj.B);
     }
    
    下面是调用AsyncCallBack方法的代码

     var argumentsObj=new ArgumentObject{ A="argument1", B="argument2"..};
    
     AsyncCallback callback = (IAsyncResult result) => CallBack(result, argumentsObj);
     // How do I know it is triggered? I set the break point into CallBack method, but it never goes to there.
    
    欢迎您提出任何意见或更正。

    更新: 我终于找到了传递论点的方法。我使用委托并调用BeginInvoke方法

    static int DoSomething(string s, int t)
        {
            Console.WriteLine(s+t.ToString());
            return 0;
        }// this is the delegate method, you can define it anyway.
    
    public delegate int MyDelegate(string s, int t);
    MyDelegate x = new MyDelegate(DoSomething);
    AsyncCallback callback = new AsyncCallback(CallBack);
    var argumentsObj=new ArgumentObject{ A="argument1", B="argument2"..};
    IAsyncResult ar = x.BeginInvoke("hello", 12, callback, argumentsObj);
    // in my case, the first two parameters are not important, only the last two are important.
    
    现在,在回调方法中,我可以将AsyncState强制转换为参数对象:

    var obj = (CallBackObj)result.AsyncState;
    
    在回调方法中,不要忘记调用EndInvoke方法,以保证不会泄漏内存或句柄

    MyDelegate x = (MyDelegate)((AsyncResult)result).AsyncDelegate;
            x.EndInvoke(result);
    

    很抱歉,未获取以下内容:
    var obj=(CallBackObj)result.AsyncState。。。无论如何,在我的例子中,当将此模式用于
    DuplexChannelFactory
    功能时,我得到了无效的强制转换,因为IAsyncState属于
    System.ServiceModel.Dispatcher.MessageRpc
    类型。不知道为什么,也不知道该怎么办。没有在互联网上的信息。