web-dev-qa-db-ja.com

コールバックとは何ですか?

コールバックとは何ですか?C#ではどのように実装されていますか?

118
cam

コンピュータープログラミング では、コールバックは 実行可能コード であり、これは 引数 として他のコードに渡されます。

ウィキペディア:コールバック(コンピューターサイエンス)

C#には、そのために デリゲート があります。イベントは多数の接続されたデリゲート(イベントハンドラー)を自動的に呼び出すことができるため、 events で頻繁に使用されます。

107
Joey

あなたに会ったばかり
これはクレイジーです、
しかし、ここに私の番号(デリゲート)があります。
したがって、何かが発生した場合(イベント)、
電話して、多分(コールバック)?

958
LightStriker

コールバックは、プロセスが特定のタスクの実行を完了したときに呼び出される関数です。

通常、コールバックの使用は非同期ロジックで行われます。

C#でコールバックを作成するには、変数内に関数アドレスを保存する必要があります。これは、delegateまたは新しいラムダセマンティックFuncまたはActionを使用して実現されます。

    public delegate void WorkCompletedCallBack(string result);

    public void DoWork(WorkCompletedCallBack callback)
    {
        callback("Hello world");
    }

    public void Test()
    {
        WorkCompletedCallBack callback = TestCallBack; // Notice that I am referencing a method without its parameter
        DoWork(callback);
    }

    public void TestCallBack(string result)
    {
        Console.WriteLine(result);
    }

今日のC#では、次のようなラムダを使用してこれを行うことができます。

    public void DoWork(Action<string> callback)
    {
        callback("Hello world");
    }

    public void Test()
    {
        DoWork((result) => Console.WriteLine(result));
    }
75

定義

callbackは、他のコードに引数として渡される実行可能コードです。

実装

// Parent can Read
public class Parent
{
    public string Read(){ /*reads here*/ };
}

// Child need Info
public class Child
{
    private string information;
    // declare a Delegate
    delegate string GetInfo();
    // use an instance of the declared Delegate
    public GetInfo GetMeInformation;

    public void ObtainInfo()
    {
        // Child will use the Parent capabilities via the Delegate
        information = GetMeInformation();
    }
}

使用法

Parent Peter = new Parent();
Child Johny = new Child();

// Tell Johny from where to obtain info
Johny.GetMeInformation = Peter.Read;

Johny.ObtainInfo(); // here Johny 'asks' Peter to read

リンク

45
serhio

コールバックは、別の関数に渡す関数ポインターです。呼び出している関数は、完了時に他の関数を「コールバック」(実行)します。

this リンクを確認してください。

10
TLiebe

ASP.Netコールバックを参照する場合:

ASP.NET Webページのデフォルトモデルでは、ユーザーはページを操作してボタンをクリックするか、ポストバックをもたらす他のアクションを実行します。ページとそのコントロールが再作成され、ページコードがサーバーで実行され、ページの新しいバージョンがブラウザーにレンダリングされます。ただし、状況によっては、ポストバックを実行せずにクライアントからサーバーコードを実行すると便利です。ページ内のクライアントスクリプトが状態情報(ローカル変数値など)を保持している場合、ページをポストして新しいコピーを取得すると、その状態が破壊されます。さらに、ページのポストバックにより処理のオーバーヘッドが発生し、パフォーマンスが低下し、ユーザーがページの処理と再作成を待つように強制できます。

クライアントの状態の損失を回避し、サーバーラウンドトリップの処理オーバーヘッドを発生させないために、クライアントコールバックを実行できるようにASP.NET Webページをコーディングできます。クライアントコールバックでは、クライアントスクリプト関数が要求をASP.NET Webページに送信します。 Webページは、通常のライフサイクルの修正バージョンを実行します。ページが開始され、そのコントロールと他のメンバーが作成された後、特別にマークされたメソッドが呼び出されます。このメソッドは、コーディングした処理を実行し、別のクライアントスクリプト関数で読み取ることができる値をブラウザーに返します。このプロセス全体を通して、ページはブラウザで公開されています。

ソース: http://msdn.Microsoft.com/en-us/library/ms178208.aspx

コードでコールバックを参照している場合:

コールバックは多くの場合、特定の操作が完了するか、サブアクションを実行するときに呼び出されるメソッドへのデリゲートです。多くの場合、非同期操作でそれらを見つけます。これは、ほぼすべてのコーディング言語に見られるプログラミングの原則です。

詳細はこちら: http://msdn.Microsoft.com/en-us/library/ms173172.aspx

7
Zyphrax

LightStrikerへの献身:
サンプルコード:

class CallBackExample
{
    public delegate void MyNumber();
    public static void CallMeBack()
    {
        Console.WriteLine("He/She is calling you.  Pick your phone!:)");
        Console.Read();
    }
    public static void MetYourCrush(MyNumber number)
    {
        int j;
        Console.WriteLine("is she/he interested 0/1?:");
        var i = Console.ReadLine();
        if (int.TryParse(i, out j))
        {
            var interested = (j == 0) ? false : true;
            if (interested)//event
            {
                //call his/her number
                number();
            }
            else
            {
                Console.WriteLine("Nothing happened! :(");
                Console.Read();
            }
        }
    }
    static void Main(string[] args)
    {
        MyNumber number = Program.CallMeBack;
        Console.WriteLine("You have just met your crush and given your number");
        MetYourCrush(number);
        Console.Read();
        Console.Read();
    }       
}

コードの説明:

上記の応答の1つで、LightStrikerが提供する面白い説明を実装するコードを作成しました。デリゲート(数値)をメソッド(MetYourCrush)に渡します。メソッド(MetYourCrush)でインタレスト(イベント)が発生すると、CallMeBackメソッドの参照を保持していたデリゲート(番号)を呼び出します。そのため、CallMeBackメソッドが呼び出されます。基本的に、コールバックメソッドを呼び出すデリゲートを渡します。

ご質問がある場合はお知らせください。

4
Mani

おそらく辞書定義ではありませんが、コールバックは通常、特定のオブジェクトの外部にある関数を参照し、保存されてから特定のイベントで呼び出されます。

例としては、UIボタンが作成され、アクションを実行する関数への参照が保存される場合があります。アクションはコードの別の部分で処理されますが、ボタンが押されるとコールバックが呼び出され、実行するアクションが呼び出されます。

C#では、「コールバック」という用語を使用するのではなく、「イベント」と「デリゲート」を使用します。デリゲートの詳細については、こちらをご覧ください こちら

1
acron

デリゲートは、C++のインターフェイスベースのコールバックと同じことを行います(COMはこれらを使用します)が、使用ははるかに簡単です。

MicrosoftはJava実装(J ++)にデリゲートを配置しますが、Sunはそれらを[Java.Sun.com]が好きではないため、Javaの公式バージョンでいつでもそれらを見ると期待しないでください。すぐに。プリプロセッサを一緒にハックしてC++で使用できるようにしているので、C#または.NETプラットフォーム(つまり、Managed C++またはVisual Basic.NET)でプログラミングしていなくても取り残されているとは思わないでください。

Cでポインターを機能させるのに慣れている場合、デリゲートは基本的に1つにロールされたポインターのペアです。

  • オブジェクトへのポインター(オプション)
  • そのオブジェクトのメソッドへのポインター

つまり、1つのデリゲートは、静的メソッドであるかオブジェクトに関連付けられているかにかかわらず、プログラム内の関数を見つけるために必要なすべての情報を渡します。

C#で次のように定義します。

public delegate void FooCallbackType( int a, int b, int c );

それらを使用する場合は、呼び出したい関数からデリゲートを作成します。

class CMyClass
{
    public void FunctionToCall( int a, int b, int c )
    {
        // This is the callback
    }

    public void Foo()
    {
        FooCallbackType myDelegate = new FooCallbackType(
            this.FunctionToCall );
        // Now you can pass that to the function
        // that needs to call you back.
    }
}

静的メソッドを指すデリゲートを作成する場合、同じように見えます。

class CMyClassWithStaticCallback
{
    public static void StaticFunctionToCall( int a, int b, int c )
    {
        // This is the callback
    }

    public static void Foo()
    {
        FooCallbackType myDelegate = new FooCallbackType(
            CMyClass.StaticFunctionToCall );
    }
}

全体として、これらはC++のインターフェイスベースのコールバックと同じことを行いますが、関数の名前付けやヘルパーオブジェクトの作成について心配する必要がないため、少し問題が少なくなり、どのメソッドからもデリゲートを作成できます。彼らはより柔軟です。

0
Gomathi

コールバックの作業手順:

1)ICallbackEventHandlerインターフェイスを実装する必要があります

2)クライアントスクリプトを登録します。

 String cbReference = Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context");
    String callbackScript = "function UseCallBack(arg, context)" + "{ " + cbReference + ";}";
    Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "UseCallBack", callbackScript, true);

1)UI呼び出しで、Onclientをクリックして、EXのjavascript関数を呼び出します:-builpopup(p1,p2,p3...)

var finalfield = p1、p2、p3; UseCallBack(finalfield, ""); UseCallBackを使用してサーバー側に渡されるクライアントからのデータ

2)public void RaiseCallbackEvent(string eventArgument) eventArgumentで、渡されたデータを取得します//サーバー側の操作を行い、「callbackResult」に渡されます

3)GetCallbackResult() //このメソッドを使用すると、データはclient(ReceiveServerData()関数)側に渡されます

callbackResult

4)クライアント側でデータを取得します:ReceiveServerData(text)、テキストサーバー応答で取得します。

0
Ganesha

コールバックを使用すると、実行可能コードを引数として他のコードに渡すことができます。 CおよびC++では、これは関数ポインターとして実装されます。 .NETでは、デリゲートを使用して関数ポインターを管理します。

いくつかの用途には、エラーシグナリングと、関数が機能するかどうかの制御が含まれます。

ウィキペディア

0
David