使用计时器

时间:2016-07-14 09:29:25

标签: c# optimization architecture

我有一个代表某个对象的类。该类包含一个Timer,它会不时触发某些方法。 但是,如果我写这样的话:

var obj = new MyClass();

然后在结束时,对象将被删除,并且定时器甚至不会工作一次。 但是我需要在内存中使用这个对象,我需要根据Timer进行工作。 所以我添加了一个包含一些无用代码的空方法:

while(true){
int k=0;
}    

现在Timer工作但我不喜欢这个设计。 有关如何改进它的任何建议吗?

P.S。 这是我测试它的方式:我创建了一个单元测试,在那里我编写了以下内容:

var obj = new MyClass();
int k=0;

我在第二行有一个断点。当我到达它时,我等待确保Timer永远不会运行。要使Timer工作,我必须修改测试:

var obj = new MyClass();
obj.EmptyWork();
int k=0;

现在计时器工作但我从未达到int k = 0;因此我无法创建第二个对象等。

2 个答案:

答案 0 :(得分:0)

该对象已被删除,但无法完成工作,因为最终'该对象将无法访问。如果你需要粘贴物体,你需要确保它永远不会变得无法进入。如果在函数中创建对象,则需要将其分配给外部变量或从函数返回。

答案 1 :(得分:0)

如果您想创建一些调度程序,也许更好的选择就是使用 Quartz 库创建任务:http://www.quartz-scheduler.net

您可以将方法/类(业务逻辑)与调度程序(计时器)隔离开来,这可以通过简单的方式进行配置。

示例执行" HelloJob"来自文档:

// define the job and tie it to our HelloJob class
IJobDetail job = JobBuilder.Create<HelloJob>()
    .WithIdentity("job1", "group1")
    .Build();

// Trigger the job to run now, and then repeat every 10 seconds
ITrigger trigger = TriggerBuilder.Create()
    .WithIdentity("trigger1", "group1")
    .StartNow()
    .WithSimpleSchedule(x => x
        .WithIntervalInSeconds(10)
        .RepeatForever())
    .Build();

// Tell quartz to schedule the job using our trigger
scheduler.ScheduleJob(job, trigger);

编辑: 您可以创建工作对象,其中所选类实现IJob(例如,对于Quartz库)。 样品(未测试):

interface IWork
{
    void Run(object input);
}

class ImmediateWork : IWork
{
    public void Run(object input)
    {
        // Code to run immediately (without schedule).
    }
}

class ScheduledWork : IWork, IJob
{
    public void Run(object input)
    {
        // Create the schedule for the 'Execute' method.
        var job = JobBuilder.Create<ScheduledWork>().Build();
        var schedule = SimpleScheduleBuilder.RepeatHourlyForTotalCount(10);
        var trigger = TriggerBuilder.Create().WithSchedule(schedule).StartNow().Build();
        ScheduleManager.Instance.ScheduleJob(job, trigger);
    }

    public void Execute(IJobExecutionContext context)
    {
        // Code to run after some time (with schedule).
    }
}

// Simple singleton implementation of the global scheduler, for demonstration purposes only.
static class ScheduleManager
{
    private static IScheduler _instance;
    public static IScheduler Instance => _instance ?? (_instance = createInstance());

    private static IScheduler createInstance()
    {
        // Create the instance of the scheduler.
        var schedulerFactory = new StdSchedulerFactory();
        var scheduler = schedulerFactory.GetScheduler();

        // Start the scheduler.
        if (!scheduler.IsStarted)
            scheduler.Start();

        return scheduler;
    }
}

如果是 MVC 应用;如果你真的需要你班上的计时器,这应该有很长的生命周期,你可以尝试使用应用程序状态https://msdn.microsoft.com/en-us/library/94xkskdf(v=vs.100).aspx