使用System.Func匿名和带有回调函数的返回对象

本文关键字:函数 回调 返回 对象 Func System 使用 | 更新日期: 2023-09-27 17:59:22

也许是一个简单的问题,但我如何才能获得异步System.Func的返回对象?

考虑一下:

private void Start(String a)
{
    System.Func<String, objectA> callasync = delegate(String strA)
    {
        return bla(stra);  // Which return a objectA
    }
    callasync.BeginInvoke(a, callback, null);
}
private void callback(IAsyncResult ar)
{
    // Here I want the objectA but how ??
}

使用回调函数时,我没有委托签名。当然,我可以在类的作用域中创建一个委托,但也许有一个读取回调函数中返回值的解决方案。

谢谢。

使用System.Func匿名和带有回调函数的返回对象

在委托上使用BeginInvoke时,传递给回调的IAsyncResult将是AsyncResult类的实例。从中,您可以获得代理的实例,并在其上调用EndInvoke

private void Start(string a)
{
    Func<string, objectA> d = strA => bla(strA);
    d.BeginInvoke(a, Callback, null);
}
private void Callback(IAsyncResult ar)
{
     AsyncResult asyncResult = (AsyncResult)ar;
     Func<string, objectA> d = (Func<string, objectA>)asyncResult.AsyncDelegate;
     objectA result = d.EndInvoke(ar);
}

您也可以这样做(不是在IDE中编写的,可能包含错误)

  private Func<String, objectA> _callDoWorkAsync = DoWork;
  private static string DoWork( objectA strA )
  {
     return bla( strA );
  }
  private void Start( String a )
  {
     _callDoWorkAsync.BeginInvoke( a, callback, null );
  }
  private void callback( IAsyncResult ar )
  {
     objectA strA = (objectA) _callDoWorkAsync.EndInvoke( ar );
  }