アプリケーション A と DLL B を両方とも C#.NET で作成しています。次のことを行うにはどうすればよいですか。
- A は B の関数を呼び出します
- B にデリゲート/コールバックを使用して A の UI のステータスを更新してもらいたい
これはBackgroundWorker に関するものではありません...その部分は A で正常に動作します。私が見ることができないのは、A で呼び出す関数を B に知らせる方法です。
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);
2 つのオプションがあります。最も一般的なのは、B にイベントがあり、A の UI がそのイベントにサブスクライブすることです。次に、B がそのイベントを発生させます。
2 番目のオプションは、A からのデリゲートをパラメーターとして B のメソッド呼び出しに渡すことです。その後、B はそのデリゲートを呼び出すことができます。
A が B に行う呼び出しでコールバック オブジェクトを渡します。インターフェイス (または緊密にバインドされたライブラリ) を使用します。コールバック オブジェクトがスレッド対応でスレッド セーフであることを確認してください。
あなたが 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
}
}