使用C#在用户定义的库中实现回调

时间:2011-04-21 10:14:48

标签: c# winforms

您好我有一些与用户在c#

中创建的库中的回拨功能相关的问题
  1. 我创建了一个名为“Sample”
  2. 的winform应用程序
  3. 我还创建了一个名为“Library”
  4. 的类库
  5. 示例只包含一个带有按钮“CALL”
  6. 的表单
  7. 我已经在库中实现了所有编码部分
  8. 当我点击表格上的通话按钮时,会调用图书馆的“激活电话”方法。
  9. 此方法在线程上执行一些工作。
  10. 我想要的是当线程工作完成后,必须调用放在我的winform中的“CALLBACK”方法。
  11. 为实现这一目标,我已将表格的“此”引用传递给图书馆
  12. 我在图书馆的正式辩论中收集了“this”作为obj“对象”类型。
  13. 有人可以建议我如何调用回调方法吗?

    我试过这个:

    if(obj.GetType()== typeOf(what to specify here))
    {
       obj.callback();
    }
    
    希望有人能给我提供帮助。 注意:库和示例都是不同的项目 如何实现回调功能?

3 个答案:

答案 0 :(得分:3)

使用回调定义库方法。

public void ACTIVATE(object arg, object arg, Action callback)
{
// Do what you have to do here.
callback.Invoke();
}

然后,在您的Sample WinForms客户端中,您可以调用类似的内容。

public void MethodInSample()
{
Library lib = new Library();

Action callback = () => { DoSomethingHere };
Lib.ACTIVATE(1,1,callback);
}

如果您希望回调返回一些参数,可以使用Func<>相反,并以这种方式定义参数。

或者,您可以使用活动。 BackgroundWorker对象就是一个很好的例子。这个类有一个名为RunWorkerAsync()的方法,它可以在后台线程上完成一些工作。然后会有一个名为RunWorkerCompleted的事件,您可以监听该事件以指示后台线程何时完成。

我认为这两种方法都是有效的,但第二种方法的好处是允许多方听取完成工作。

答案 1 :(得分:1)

让ActivateCall功能的用户在您的库中提供回调:

function void ActivateCall(Action callback){
  //Do Stuff
  if (null != callback){
     callback();
   }
}

然后以您的主要形式:

function button1_Click(object sender, EventArgs e){
  library.ActivateCall(DoStuff);
}

有很多事情需要注意,因为你说你在库调用中的一个单独的线程中做了什么。如果您在回调中完全改变GUI,则需要确保在GUI线程中完成工作。一旦线程中的所有工作都完成(我怀疑),您还需要确保运行回调。

要确保您的回调在GUI线程中运行(如果需要),请执行以下操作:

function button1_Click(object sender, EventArgs e){
  library.ActivateCall(DoStuff());
}

function void DoStuff(){
  if (InvokeRequired(){
    Invoke(DoStuff);
    return;
  }

  //Do stuff here....
}

答案 2 :(得分:0)

最后,我使用委托+活动

实现了这一目标
*****************Sample class**************************


    call()
        {
          //activate method of library is called
          libraryObject.stop += new LibraryClass.callback(setCallbackMethod);
          libraryObject.activate();
        }

        public void setCallbackMethod(String str)
         {
// most important to be back on main thread

 this.Invoke((MethodInvoker)delegate
                {
                    btn.Enabled = true;
                });
         }



*******************Library***************************

public delegate void callback(String str);
public event callback stop;
activate()
{
   //instantiates a thread/timer
            aTimer = new System.Timers.Timer();
            aTimer.Elapsed += new ElapsedEventHandler(CheckForMessage);
            aTimer.Interval = 1000;
            aTimer.Start();
}


   public void CheckForMessage(object source, ElapsedEventArgs e)
    {
    //performs some work

    //calls callback method of ui thread in sample code
        if (stop != null)
            {
                stop("COMPLETED");
            }
    }