我有一个代表某个对象的类。该类包含一个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;因此我无法创建第二个对象等。
答案 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