Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用C在用户定义库中实现回调_C#_Winforms - Fatal编程技术网

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

C# 使用C在用户定义库中实现回调,c#,winforms,C#,Winforms,您好,我有一些关于c中用户创建的库中回调功能的问题 我已经创建了一个名为Sample的winform应用程序 我还创建了一个名为library的类库 示例仅包含一个具有按钮say CALL的表单 我已经在一个库中实现了所有的编码部分 当我点击表单上的call按钮时,就会调用库的ACTIVATE调用方法。 此方法在线程上执行一些工作。 我想要的是当线程工作完成时,必须调用放置在winform中的回调方法。 为了实现这一点,我已将此表单引用传递给了图书馆 我在图书馆的正式辩论中把它作为obj对象类型

您好,我有一些关于c中用户创建的库中回调功能的问题

我已经创建了一个名为Sample的winform应用程序 我还创建了一个名为library的类库 示例仅包含一个具有按钮say CALL的表单 我已经在一个库中实现了所有的编码部分 当我点击表单上的call按钮时,就会调用库的ACTIVATE调用方法。 此方法在线程上执行一些工作。 我想要的是当线程工作完成时,必须调用放置在winform中的回调方法。 为了实现这一点,我已将此表单引用传递给了图书馆 我在图书馆的正式辩论中把它作为obj对象类型收集。 有人能告诉我如何调用回调方法吗

我试过这个:

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

使用回调定义库方法

public void ACTIVATE(object arg, object arg, Action callback)
{
// Do what you have to do here.
callback.Invoke();
}
然后,在示例WinForms客户端中,您可以调用类似这样的东西

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

Action callback = () => { DoSomethingHere };
Lib.ACTIVATE(1,1,callback);
}
如果希望回调函数返回一些参数,可以改用Func函数并以这种方式定义参数

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


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

使用回调定义库方法

public void ACTIVATE(object arg, object arg, Action callback)
{
// Do what you have to do here.
callback.Invoke();
}
然后,在示例WinForms客户端中,您可以调用类似这样的东西

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

Action callback = () => { DoSomethingHere };
Lib.ACTIVATE(1,1,callback);
}
如果希望回调函数返回一些参数,可以改用Func函数并以这种方式定义参数

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


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

让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....
}

让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....
}

最后,我使用Delegate+事件实现了这一点


最后,我使用Delegate+事件实现了这一点


您可以使用库中的事件来指示工作已完成,或者将回调委托think Action或Func传递到库方法中。谢谢您,McGuinness,我知道这是要完成的,但我无法使其工作,你知道我可以从哪个示例中检查如何做,以及我无法传递委托,因为引用是对象类型。你可以使用库中的事件来指示工作已完成,或者将回调委托think Action或Func传递到库方法中。谢谢你,我知道这是要做的,但我做不到,如果我在库中创建一个委托方法并在示例代码中实现它,那么我可以在库中定义一个委托签名并将其用作该方法的参数在库中委托方法并在示例代码中实现它,那么我可以实现吗?您可以在库中定义委托签名并将其用作该方法的参数。如果我在库中创建委托方法并在示例代码中实现它,那么我可以实现吗?我不确定您确切的意思是什么?“创建委托方法”指的是接受委托的方法还是要使用的方法
你想让代表通过吗?您希望传递的委托可能是表单上的一个方法……如果我在库中创建一个委托方法并在示例代码中实现它,那么我可以实现吗?我不确定您确切的意思是什么?通过创建委托方法,您是指接受委托的方法还是作为要传递的委托使用的方法?您希望传递的委托是表单上的一个方法。。。。