簡體   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