0

私は2つのクラスを持っています。以下は、質問をする前に何が起こっているかの内訳です...

myClass1:

myClass1(){

    myClass2 c2 = new myClass2();
    c2.service();

}

public void myFunction1(){

    Console.Write("Function returned!");

}

myClass2:

public void service(){

    callWebService(myFunction1); // The parameter you pass here is the function that control 
                      // will pass back to once the called function is done.

}

public void callWebService(DownloadStringCompletedEventHandler callback){

    //Calls web service and does some other operations

}

そして最後に質問です。上記のように、2 つのクラスがあり、class1 は class2 の関数を呼び出します。その関数は、Web サービスを呼び出す class2 でも別の関数を呼び出します。その Web サービスが完了すると、制御フローは、関数呼び出しで渡した関数に戻ります。

ただし、コールバック関数は同じクラスにある必要があるため、1 つのクラスに固執することになります。問題は、別のクラスの関数をコールバック関数に渡すにはどうすればよいかということです。

これがすべて理にかなっていることを願っています。もう少し問題を解決するために何かをためらわないでください。ありがとう!

4

2 に答える 2

1

デリゲートを渡す代わりに、イベントを使用します。

class MyClass1
{
    public MyClass1()
    {
        var c2 = new MyClass2();

        c2.ActionwebServiceCalled += MyCallBack; //register for the event
        c2.CallWebService();
    }

    public void MyCallBack(object sender, DownloadStringCompletedEventArgs e)
    {
        Console.Write("Function returned!");
    }
}

class MyClass2
{
    public event DownloadStringCompletedEventHandler ActionwebServiceCalled;

    public void CallWebService()
    {
        DownloadStringCompletedEventArgs e = null;

        //Calls web service and does some other operations...

        var handler = ActionwebServiceCalled;
        if (handler != null)
            handler(this, e);
    }
}

そうは言っても、 .NET 4 (または Rx )を使用している場合は、Web サービス呼び出しに非同期性を導入することをお勧めします。その場合、タスク ベースの非同期パターン (TAP)が適しています。.NET 3.5 以前の場合は、非同期プログラミング モデル (APM)に従う必要があります。

于 2012-11-20T17:11:10.030 に答える
1

Serviceクラスを変更してMyClass1'sメソッドを渡すことができます。たとえば、以下のコードでは、関数 ServiceCallCompleteはパラメーターとしてServiceクラス コンストラクターに渡されます。

関数は、(コールバック関数の定義に応じて) ActionまたはFuncデリゲート タイプとして保存できます。サービス ジョブが完了すると、delegate( _callBack()) を呼び出すと、 でコールバック関数が呼び出されMyClass1ます。

public class MyClass1
{
    //The callback Function
    public void ServiceCallComplete()
    {
        Console.WriteLine("Function returned.");
    }

}

public class Service
{
    //delegate to store the callback function.
    private readonly Action _callBack;

    public Service(Action callBack)
    {
        //store the callback function
        _callBack = callBack;
    }

    public void Method()
    {
        //long running operation
        .
        .
       //Invoke the callback
        _callBack();
    }
}


MyClass1 obj = new MyClass1();
Service svc = new Service(obj.ServiceCallComplete);
svc.Method();
于 2012-11-20T11:38:55.267 に答える