我像这样用单例实现一个类
public static SingleToneClass Instance
{
get
{
return Lazy.Value;
}
}
private static readonly Lazy<SingleToneClass > Lazy = new Lazy<SingleToneClass >(() => new RABTProxy());
在SingleToneClass
中有一个System.Timers计时器
在尝试从不同线程访问类时,计时器突然停止 任何想法如何解决这样的问题,这只是测试的示例
class Program
{
static void Main(string[] args)
{
//now create a timer each ten seconds create for create
var mainTimer = new Timer
{
Interval = 100
};
mainTimer.Elapsed += (sender, eventArgs) =>
{
Task.Factory.StartNew(() =>
{
while (true)
{
SingleToneClass.Instance.DoWwork();
Thread.Sleep(10);
}
});
};
mainTimer.Start();
Console.ReadLine();
}
}
在Singleton中使用计时器是个好主意
答案 0 :(得分:0)
您的评论说每10秒就有一个计时器,但实际上您每秒获得10次。
然后,您将在线程池上产生新任务,这些任务将永远运行并被Thread.Sleep()阻塞。这将使用您的所有线程池线程,并且必须创建新的线程池线程。不好!</ p>
如果只想定期调用DoWork,则应跳过计时器并启动一个任务。
Task.Factory.StartNew(async () =>
{
while (true)
{
SingleToneClass.Instance.DoWwork();
await Task.Delay(TimeSpan.FromSeconds(10));
}
});
答案 1 :(得分:0)
使用Microsoft的Reactive Framework(又名Rx)-仅获取NuGet System.Reactive
并添加using System.Reactive.Linq;
。
然后执行以下操作:
Observable
.Interval(TimeSpan.FromMilliseconds(10.0))
.Subscribe(_ => SingleToneClass.Instance.DoWwork());