9

我正在用 C#.NET 编写应用程序 A 和 DLL B。如何执行以下操作:

  1. A调用B中的函数
  2. 希望 B 使用委托/回调来更新 A 的 UI 中的状态

这与 BackgroundWorker无关……那部分在 A 中工作正常。我看不到的是如何让 B 知道在 A 中调用什么函数。

4

4 回答 4

14

要扩展 Rob Prouse 的答案,您需要声明一个委托,然后将匹配的方法传递给它。

在 B 中:

public delegate void CallbackDelegate(string status);

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

在一个:

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

当您调用该方法时:

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

你有两个选择。最常见的是在 B 中有一个事件,并让 A 中的 UI 订阅该事件。B 然后触发该事件。

第二种选择是将来自 A 的委托作为参数传递给 B 中的方法调用。然后 B 可以调用该委托。

于 2008-11-13T20:42:30.223 回答
1

在对 B 的调用 A 中传入回调对象。使用接口(或紧密绑定的库)。确保回调对象是线程感知和线程安全的。

于 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 回答