我习惯于Javascript,我可以简单地将一个函数作为参数传递给稍后用作回调。这很好,也很容易。
现在我正在用c#编写一个应用程序,并希望完成同样的事情。
基本上,我的应用程序如下所示,需要身份验证令牌。但是,在getData阶段,如果令牌过期,我需要调用refreshToken()。如何通过refreshToken()传递回调函数,以便getData知道刷新令牌时要调用的内容?
这是我将在Javascript中做什么的图表,但是我会在C#中执行此操作,还是仅仅传递回调?:
getData(callback);
// Looks like the token is expired, exiting the getData function and refreshing token
refreshToken(function(){ getData(callback); });
// Token is refreshed, now call getData()
getData(callback);
// Callback is run
或者,或者,我可以同步执行refreshToken调用,而不是使用大量的回调。但是,无论出于什么原因,WP7上的RestSharp都没有显示Execute,只是ExecuteAsync,这就是我现在使用的。有谁知道为什么这种方法对我来说似乎不存在?
答案 0 :(得分:4)
要在C#中将函数作为参数传递,使用delegate。委托指定了传递给方法的函数的预期返回类型和参数,并且您的回调方法必须符合此规范,否则您的代码将无法编译。
代理通常直接在命名空间中声明,并采用以下形式:
<access modifier(s)> delegate <return type> <DelegateName>([argument list]);
例如,在C#中,一个名为FooCallback的委托代表一个不带参数并返回void的Foo方法的回调函数,如下所示:
namespace Demo
{
public delegate void FooCallback();
}
采用FooCallback参数的函数如下所示:
namespace Demo
{
//delegate for a FooCallback method from the previous code block
public delegate void FooCallback();
public class Widget
{
public void BeginFoo(FooCallback callback)
{
}
假设您有一个与委托签名匹配的方法,您只需将其名称作为委托参数的值传递即可。例如,假设您有一个名为MyFooCallback
的函数,您可以将其作为参数传递给StartFoo
方法,如下所示:
using Demo; //Needed to access the FooDelegate and Widget class.
namespace YourApp
{
public class WidgetUser
{
private Widget widget; //initialization skipped for brevity.
private void MyFooCallback()
{
//This is our callback method for StartFoo. Note that it has a void return type
//and no parameters, just like the definition of FooCallback. The signature of
//the method you pass as a delegate parameter MUST match the definition of the
//delegate, otherwise you get a compile-time error.
}
public void UseWidget()
{
//Call StartFoo, passing in `MyFooCallback` as the value of the callback parameter.
widget.BeginFoo(MyFooCallback);
}
}
}
虽然可以使用参数定义委托,但是无法像调用方法时通常那样在方法名称旁边传递参数列表
namespace Demo
{
public delegate void FrobCallback(int frobberID);
//Invalid Syntax - Can't pass in parameters to the delegate method this way.
BeginFrob(MyFrobCallback(10))
}
当委托指定参数时,调用委托的方法接受委托所需的参数,并在调用委托方法时将它们传递给委托方法:
BeginFrob(MyFrobCallback, 10)
然后,BeginFrob方法将使用传入的frobberID值10调用MyFrobCallback,如下所示:
public void BeginFrob(FrobCallback callback, int frobberID)
{
//...do stuff before the callback
callback(frobberID);
}
Lambda Expressions允许您定义一个使用它的方法,而不是需要显式声明它
BeginFoo((int frobberID) => {your callback code here;});
总之,委托是一种方法,可以将方法作为参数传递给其他方法。
答案 1 :(得分:3)
silverlight / wp7中没有同步Web调用,因此这不是一个重新安装的问题。
因为亚瑟说你想要代表。
function getData(Action<string> callback) {
if (token.needRefresh) {
refrshToken(() => getData(callback) );
return;
}
// get Data
callback(data);
}
function refreshToken(Action callback) {
// token.refresh
callback();
}
答案 2 :(得分:2)