【问题标题】:C# callback from DLL来自 DLL 的 C# 回调
【发布时间】:2008-11-13 20:35:56
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# dll delegates callback


    【解决方案1】:

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

    【讨论】:

    • 谢谢!我刚刚解决了这个问题,很高兴得到您的确认。
    • 当然,如果 A 和 B 在不同的程序集中,您可能必须将委托粘贴在自己的程序集中以避免递归依赖问题。
    • 如果委托在B中声明,你将如何获得循环依赖?
    • 我确实将委托定义放在了它自己的 DLL/程序集中,这对我来说效果很好。
    • 您忘记实例化回调处理程序
    【解决方案2】:

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

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

    【讨论】:

    • 我打算选择第二个选项,但语法让我感到困惑。
    • 您缺少第三个选项。您可以在 A 中创建一个委托来隐藏 B 方法,这样 B 就不需要知道任何关于它的信息。非常适合异步调用通常不支持的第三方库中的方法。
    • 我最终尝试了第一个和第二个选项。就我而言,第二个的语法更简洁。谢谢!
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      如果你控制 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
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-18
        • 1970-01-01
        • 2012-10-30
        • 2014-08-18
        • 1970-01-01
        相关资源
        最近更新 更多