如何向C#类库DLL传递函数并在其定时器事件中执行
实现C#服务向类库DLL传递方法并在定时器触发时执行
1. 修改类库DLL代码,支持接收外部方法
我们用.NET内置的Action类型(无参无返回值委托)来存储服务传递的方法,在定时器事件中调用该方法。修改后的DLL代码如下:
using System; using System.Timers; namespace MyClassLibrary { public class Main_Prog { private System.Timers.Timer timer1 = new System.Timers.Timer(); // 存储外部传递的方法 private Action _externalMethod; // 修改Main_Start方法,接收Action参数 public void Main_Start(Action externalMethod) { _externalMethod = externalMethod; Initialize_timer1(); } public void Initialize_timer1() { timer1.Elapsed += OnTimedEvent_timer1; timer1.Interval = 35; timer1.Start(); } private void OnTimedEvent_timer1(object sender, EventArgs e) { // 先判空避免空引用异常 if (_externalMethod != null) { _externalMethod(); // 执行传递过来的服务端方法 } // 原有业务代码 } } }
2. 修改服务应用代码,传递方法到DLL
在服务的OnStart方法中,将服务自身的func_passed方法作为参数传入DLL的Main_Start方法:
using MyClassLibrary; using System.ServiceProcess; 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(); // 传递当前实例的func_passed方法给DLL main_Prog.Main_Start(func_passed); } public void func_passed() { // 你的补充业务代码 } } }
关键说明
- 如果你的方法需要接收参数或返回值,可以替换为
Action<T>、Func<TResult>等对应委托类型。 - 必须在调用外部方法前判空,防止DLL未接收到方法时触发空引用异常。
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

