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

时间:2011-06-16 12:32:15

标签: c# asynchronous

也许是简单的问题,但我怎样才能获得异步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 ??
}

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

感谢。

2 个答案:

答案 0 :(得分:1)

在委托上使用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);
}

答案 1 :(得分:0)

你也可以这样做(不是用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 );
  }