我在我的c#服务应用程序中调用一个c#类dll。但是在类dll中,在某些时候必须执行一个在调用者应用程序上定义的方法。所以我想传递,像参数一样,整个方法到dll,必须在特定的时间执行。
具有挑战性的一点是,该函数必须在dll中以计时器事件的形式执行。在这种情况下如何传递函数呢?
我调用dll的c#应用程序。
using MyClassLibrary; // my dll
namespace Concheetah_Service_Bahmuller
{
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
MyClassLibrary.Main_Prog main_Prog = new MyClassLibrary.Main_Prog();
main_Prog.Main_Start(); // starting point of my dll
}
public void func_passed()
{
// some supplementary code
}
}
}
MyClassLibrary
System.Timers.Timer timer1 = new System.Timers.Timer();
public void Main_Start()
{
Initialize_timer1(); // starting point of the dll
}
public void Initialize_timer1()
{
timer1.Elapsed += new ElapsedEventHandler(OnTimedEvent_timer1);
timer1 = 35;
timer1.Start();
}
private void OnTimedEvent_timer1(object sender, EventArgs e)
{
//some code
func_passed(); // at this point my passed function should be executed.
}
看看委托、匿名方法和Lambda表达式。
请注意,只要您有对其他项目或程序集的引用,并且您想要访问的内容是公共的,那么代码是否在另一个DLL (c#术语中的另一个程序集)中都没有区别。
像这样更改库(只显示更改的内容):
private Action _timerAction;
public void Main_Start(Action timerAction)
{
_timerAction = timerAction;
Initialize_timer1();
}
private void OnTimedEvent_timer1(object sender, EventArgs e)
{
//some code
_timerAction();
// If _timerAction can be null, call it like this instead:
_timerAction?.Invoke();
}
然后在应用程序中像这样调用它:
main_Prog.Main_Start(func_passed);
确保不要在func_passed
后面加上大括号()
,因为我们不想在这里调用函数,我们想把函数本身作为参数传递。
有不同的Action和Func委托具有不同数量的参数。与Action
不同,Func
的返回类型与void
不同。
另一种解决问题的方法是让库公开一个应用程序可以订阅的事件。
参见:Handle and raise events