Windows Phone 8 - 将参数传递给回调函数

时间:2013-11-06 18:23:11

标签: c# windows-phone-8

我是C#的新手,为Windows Phone 8开发并遇到了一个我无法克服的问题。

我创建了一个执行某些HTTP请求的类,最后应该调用一个回调函数。

我需要将一个参数传递给回调函数,但我无法弄清楚如何做到这一点。

看起来我需要IAsyncResult,但我无法创建它的实例。

我正在使用:

调用回调函数
CallBack.Invoke(null);

哪个很好用,但我无法通过论证。

PS:CallBack是AsyncCallback()

修改 - 更多代码:

呼叫者:

private void abcRenew_Click(object sender, EventArgs e)
{
  api = new abcAPI();
  api.CallBack = new AsyncCallback(abcRenew_Click_callback);
  api.getNewAbc();
}

public void abcRenew_Click_callback(IAsyncResult asynchronousResult)
{
  /* should get some values from api
}

API:

public class abcAPI
{
  public System.AsyncCallback CallBack { get; set; }

  public void getNewAbc()
  {
    call();
  }

  private void call()
  {
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("...");
    request.ContentType = "application/x-www-form-urlencoded";
    request.Method = "POST";
    request.BeginGetRequestStream(new AsyncCallback(call_RequestStreamCallback), request);
  }

  void call_RequestStreamCallback(IAsyncResult asynchronousResult)
  {
    /* ... */
    request.BeginGetResponse(new AsyncCallback(loadAndPostGeoposition_ResponseCallback), request);
  }

  void loadAndPostGeoposition_ResponseCallback(IAsyncResult asynchronousResult)
  {
    /* ... */

    /* shall return this Pointer to CallBack function -> 
       Needs to be done, because there could be more than one running at the same time */
    if (CallBack != null)
      CallBack.Invoke(null);

  }
}

2 个答案:

答案 0 :(得分:0)

简短回答:改为使用BeginInvoke / EndInvoke

http://msdn.microsoft.com/en-us/library/system.runtime.remoting.messaging.asyncresult(v=vs.110).aspx有一个完全相同的例子。注意返回值是如何通过EndInvoke传递给回调的。编译器将自动生成AsyncResult代码。

修改

在看到更多代码后,我发现你完全错了。它应该真的很容易将abcApi.Callback的类型更改为Action<YourReturnValueTypeHere>,而只是调用它。相应地调整回调函数的参数类型,你会没事的。

答案 1 :(得分:0)

你可以使用这样的匿名方法:

private void abcRenew_Click(object sender, EventArgs e)
{
    var api = new abcAPI();

    Action<IAsyncResult> callback = asynchronousResult =>
    {
        /* Now `api` is in scope */
    };

    api.CallBack = new AsyncCallback(callback);
    api.getNewAbc();
}