您好我有一些与用户在c#
中创建的库中的回拨功能相关的问题有人可以建议我如何调用回调方法吗?
我试过这个:
if(obj.GetType()== typeOf(what to specify here))
{
obj.callback();
}
希望有人能给我提供帮助。
注意:库和示例都是不同的项目
如何实现回调功能?
答案 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");
}
}