gpt4 book ai didi

c# - 为每个实例创建一个计时器有什么问题吗?

转载 作者:行者123 更新时间:2023-11-30 14:56:34 25 4
gpt4 key购买 nike

为了便于理解,我将以 DHCP 租约的简单抽象为例:租约包含 IP 和 MAC 地址、授予时间以及可以在给定的时间跨度内续订。一旦过期,将调用一个事件。同样,这只是我能想到的最小示例:

using System;
using System.Net;
using System.Net.NetworkInformation;
using System.Timers;

namespace Example
{
public class Lease
{
public IPAddress IP
{
get;
private set;
}

public PhysicalAddress MAC
{
get;
private set;
}

public DateTime Granted
{
get;
private set;
}

public event EventHandler Expired;

private readonly Timer timer;

public Lease(IPAddress ip, PhysicalAddress mac, TimeSpan available)
{
IP = ip;
MAC = mac;

timer = new Timer();
timer.AutoReset = false;
timer.Elapsed += timerElapsed;

Renew(available);
}

public void timerElapsed(object sender, EventArgs e)
{
var handle = Expired;
if (handle != null)
{
handle(this, EventArgs.Empty);
}
}

public void Renew(TimeSpan available)
{
Granted = DateTime.Now;
timer.Interval = available.TotalMilliseconds;
timer.Enabled = true;
}
}
}

在创建这样一个类的“几千个”实例时,有什么需要考虑的吗?我主要关心计时器。 我应该为这样的任务考虑另一种设计模式(比如所有租约的管理器,还是根本不使用计时器?)或者在创建大量计时器时没有什么可担心的,这是合适的方法吗?至少在涉及计时器和事件时我总是尽量保持谨慎。

最佳答案

无需创建数千个计时器,您可以只存储每个 Lease 的到期时间对象,然后在单线程中定期查询过期的对象。

我头脑中的代码示例:

var leases = new List<Lease>();
var running = true;

var expiredChecker = Task.Factory.StartNew(() =>
{
while (running)
{
var expired = leases.All(l => l.ExpirationDate < DateTime.Now);
// do something with the expired lease objects
}
});

假设您有一个 IEnumerable<Lease> , 一个 DateTime属性名为 ExpirationDate在你的 Lease对象,然后您可以通过在要停止时将 running 设置为 false 来取消此操作。

关于c# - 为每个实例创建一个计时器有什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22527216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com