我正在C#.NET中编写应用程序A和DLL B.我如何做到以下几点:
这是不关于BackgroundWorker ...那部分在A中工作正常。我看不到的是如何让B知道在A中调用什么函数。
答案 0 :(得分:13)
要扩展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);
答案 1 :(得分:6)
您有两种选择。最常见的是在B中有一个事件,并在A中使用您的UI订阅该事件。然后B发射那个事件。
第二个选项是将A中的委托作为参数传递给B中的方法调用。然后B可以调用该委托。
答案 2 :(得分:1)
在调用A make到B中传入回调对象。使用接口(或紧密绑定的库)。确保回调对象具有线程感知和线程安全。
答案 3 :(得分: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
}
}