2011-07-17 20 views
2

私はJavascriptに慣れていますが、後でコールバックとして使用するパラメータとして関数を渡すことができます。それは素敵で簡単でした。C#のコールバック関数

今私は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コールを同期的に行うことができました。しかし、RestSharpはWP7上で何らかの理由でExecuteを表示していないので、今使っているのはExecuteAsyncだけです。なぜ誰かがこの方法が私のために存在しないように見えますか?それはrestsharpの問題ではありませんので、あなたが探しているもの

答えて

3

シルバー/ 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(); 
} 
+0

完璧、例のおかげで。ちょうどそれが働いた:) –

4

C#でパラメータとして関数を渡すには、delegateを使用します。デリゲートは、メソッドに渡される関数の期待される戻り値の型と引数を指定し、コールバックメソッドはこの仕様に準拠しなければなりません。そうしないと、コードはコンパイルされません。

参加者は、一般的に、名前空間内で直接宣言され、形取りされています。たとえば

<access modifier(s)> delegate <return type> <DelegateName>([argument list]);

、C#の引数を取らず、voidを返すfooメソッドのコールバック関数を表すFooCallbackという名前のデリゲートでの

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

} 

デリゲートのシグネチャと一致するメソッドがあると仮定すると、その名前をデリゲートパラメータの値として渡すことができます。たとえば、あなたがこのようなStartFooメソッドにパラメータとして渡すことができMyFooCallbackという名前の関数を持っていると仮定すると:それは引数を持つデリゲートを定義することは可能ですが

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

することは、引数を渡すことはできませんメソッド名と一緒にリスト1は、通常の方法

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方法は、このような10のfrobberID値に渡されたとMyFrobCallbackを呼び出します:

public void BeginFrob(FrobCallback callback, int frobberID) 
{ 
//...do stuff before the callback 
callback(frobberID); 
} 

Lambda Expressionsは、あなたがそれはむしろ明示的に必要とするよりも、使用されるメソッドを定義することができますそれを要約すると

BeginFoo((int frobberID) => {your callback code here;});

を宣言し、代表団は、OTに渡す方法するための手段でありますパラメータとしての彼女の方法。

関連する問題