繁体   English   中英

来自DLL的C#回调

[英]C# callback from DLL

我正在C#.NET中编写应用程序A和DLL B. 我该怎么做:

  1. A中的呼叫功能
  2. 希望B使用委托/回调来更新A的UI中的状态

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

要扩展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);

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

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

传入调用A make to 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
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM