我是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);
}
}
答案 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();
}