c#在后台工作者中使用定时器
本文关键字:定时器 工作者 后台 | 更新日期: 2023-09-27 18:09:40
我还没找到解决办法…希望有人能帮助我。
我有一个后台工作者,它运行直到它被用户取消(它从套接字读取数据并将其写入文件)。
现在我想在一段时间后分割输出文件,例如每2分钟创建一个新文件。
为了实现这一点,我想使用一个定时器,比如
private void bckWrkSocket_DoWork(object sender, DoWorkEventArgs e)
{
//create timer and set its interval to e.Argument
//start timer
while(true)
{
if(timer.finished == true)
{
//close old file and create new
//restart timer
}
...
}
}
有什么建议/想法吗?
编辑:秒表的伎俩。这是我的解决方案这是我的解决方案:
private void bckWrkSocket_DoWork(object sender, DoWorkEventArgs e)
{
long targettime = (long) e.Argument;
Stopwatch watch = new Stopwatch();
if (targettime > 0)
watch.Start();
while(true)
{
if ((targettime > 0) && (watch.ElapsedMilliseconds >= targettime))
{
...
watch.Reset();
watch.Start();
}
}
使用秒表检查while循环中的Elapsed属性。这样可以防止并发写入和关闭同一个文件。
从设计的角度来看,我会将编写和分割文件的关注点分开。您可能想要查看log4net (NLog?)的源代码,因为它们有滚动文件追加器的实现,因为您可能必须小心不要因为丢失一些数据而搞砸。
您可以使用Threading。像这样的定时器
private static void bckWrkSocket_DoWork(object sender, DoWorkEventArgs e)
{
var timer = new Timer(x =>
{
lock (file)
{
// close old file and open new file
}
}, null, 0, (int)e.Argument);
while(true)
{
if (bckWrkSocket.CancellationPending) { e.Cancel = true; return; }
// check socket etc.
}
}
定义一个全局变量来存储计时器滴答计数。
int timerCount = 0;
private void bckWrkSocket_DoWork(object sender, DoWorkEventArgs e)
{
timer.Tick += new EventHandler(TimerEventProcessor);
// Sets the timer interval to 1 minute.
timer.Interval = 60000;
timer.Start();
}
public void TimerEventProcessor(Object myObject,
EventArgs myEventArgs) {
if(timerCount % 2 == 0)
//Do you works
timerCount++;
}