【发布时间】:2008-11-13 20:35:56
【问题描述】:
我正在用 C#.NET 编写应用程序 A 和 DLL B。如何执行以下操作:
- A 调用 B 中的函数
- 希望 B 使用委托/回调来更新 A 的 UI 中的状态
这不是关于BackgroundWorker...那部分在A中工作正常。我看不到的是如何让B知道在A中调用什么函数。
【问题讨论】:
我正在用 C#.NET 编写应用程序 A 和 DLL B。如何执行以下操作:
这不是关于BackgroundWorker...那部分在A中工作正常。我看不到的是如何让B知道在A中调用什么函数。
【问题讨论】:
要扩展 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);
【讨论】:
你有两个选择。最常见的是在 B 中有一个事件,并在 A 中让您的 UI 订阅该事件。 B 然后触发该事件。
第二个选项是从 A 传入一个委托作为参数传递给 B 中的方法调用。然后 B 可以调用该委托。
【讨论】:
在对 B 的调用 A 中传入回调对象。使用接口(或紧密绑定的库)。确保回调对象是线程感知和线程安全的。
【讨论】:
如果你控制 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
}
}
【讨论】: