【问题标题】:How to set object to AsyncState and pass it into AsyncCallback method如何将对象设置为 AsyncState 并将其传递给 AsyncCallback 方法
【发布时间】:2016-04-26 01:36:41
【问题描述】:

两个问题:

  1. 如何将参数传递给AsyncCallback 方法?

  2. 如何调用AsyncCallback 方法?

这是背景:

我正在使用 .NET Framework 3.5 开发一个旧项目。我想创建一个异步方法来做一些工作而不阻塞当前线程。由于项目是老版本 Async Await 关键字不可用,我打算做所有并行工作,包括一些数据库查询和 AsyncCallback 方法中的 api 调用。我知道 AsyncState 可以用来传达参数。因为我需要多个参数,所以我打算将这些参数包含到一个对象中并将对象设置为 AsyncState,这样我就可以将 AsyncState 转换为要在 AsyncCallback 方法中使用的对象。我没有找到好的方法。我找到了这个link,但我不使用 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.

感谢任何想法或更正。

【问题讨论】:

    标签: c# asynchronous


    【解决方案1】:

    更新: 我终于找到了一种传递参数的方法。我使用委托并调用 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;
    

    在CallBack方法中,不要忘记调用EndInvoke方法,以保证不泄漏内存或句柄

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

    【讨论】:

    • 抱歉,没有得到这个:var obj = (CallBackObj)result.AsyncState;...无论如何,在我的情况下,当将此模式用于DuplexChannelFactory<IMessage> 功能时,我得到了无效的转换,因为 IAsyncState 是@987654326 @ 类型。不知道为什么以及如何处理。互联网上没有信息。
    猜你喜欢
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多