9

アプリケーション A と DLL B を両方とも C#.NET で作成しています。次のことを行うにはどうすればよいですか。

  1. A は B の関数を呼び出します
  2. B にデリゲート/コールバックを使用して A の UI のステータスを更新してもらいたい

これはBackgroundWorker に関するものではありません...その部分は A で正常に動作します。私が見ることができないのは、A で呼び出す関数を B に知らせる方法です。

4

4 に答える 4

14

Rob Prouse の回答を拡張するには、デリゲートを宣言してから、それに一致するメソッドを渡す必要があります。

B:

public delegate void CallbackDelegate(string status);

public void DoWork(string param, CallbackDelegate callback)
{
    callback("status");
}

A:

public void MyCallback(string status)
{
    // Update your UI.
}

メソッドを呼び出すと、次のようになります。

B.DoWork("my params", MyCallback);
于 2008-11-13T20:51:51.013 に答える
6

2 つのオプションがあります。最も一般的なのは、B にイベントがあり、A の UI がそのイベントにサブスクライブすることです。次に、B がそのイベントを発生させます。

2 番目のオプションは、A からのデリゲートをパラメーターとして B のメソッド呼び出しに渡すことです。その後、B はそのデリゲートを呼び出すことができます。

于 2008-11-13T20:42:30.223 に答える
1

A が B に行う呼び出しでコールバック オブジェクトを渡します。インターフェイス (または緊密にバインドされたライブラリ) を使用します。コールバック オブジェクトがスレッド対応でスレッド セーフであることを確認してください。

于 2008-11-13T20:43:00.673 に答える
1

あなたが B をコントロールしている場合、Rob Prouse または Brody の答えは問題なく機能します。

しかし、B をまったく変更できない場合はどうなるでしょうか。その場合、シグネチャがターゲット メソッドのシグネチャと一致する限り、独自に作成したデリゲートでメソッドをいつでもラップできます。

したがって、b() という名前のパブリック メソッドを持つ B という名前のクラス インスタンスがあるとします (もちろん、B dll アセンブリから)。A アプリケーションのクラス A は、次のように非同期に呼び出すことができます。

public class A
{
    delegate void BDelegate();

    public void BegineBMethod()
    {
        BDelegate b_method = new BDelegate(B.b);
        b_method.BeginInvoke(BCallback, null);
    }

    void BCallback(IAsyncResult ar)
    {
       // cleanup/get return value/check exceptions here
    }
}
于 2008-11-13T20:55:37.497 に答える