0

我对 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
}

接口:

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);

  }
}
4

2 回答 2

0

简短的回答:使用BeginInvoke/EndInvoke代替。

在http://msdn.microsoft.com/en-us/library/system.runtime.remoting.messaging.asyncresult(v=vs.110).aspx有一个完整的例子,你需要的东西完全一样。注意返回值是如何通过EndInvoke. 编译器会AsyncResult自动生成代码。

编辑

在看到更多代码后,我发现你完全错了。更改to的类型并调用它应该容易。相应地调整回调函数的参数类型,你会没事的。abcApi.CallbackAction<YourReturnValueTypeHere>

于 2013-11-06T19:35:09.373 回答
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();
}
于 2013-11-07T02:57:18.547 回答