我的应用程序写入一个日志文件(当前使用log4net).我想设置一个计时器和一个后台工作程序来读取日志文件并将其内容打印到我的表单中的某个控件中,同时它正在被写入.
我无法使用FileSystemWatcher类,因为它看起来很破碎:有时事件"已更改"会触发,有时则不会.它具有极低的"汇集率".
所以我创建了一个Timer和一个FileSystemWatcher.在计时器的"tick"事件中,后台工作人员完成其工作.
问题是:如何只读取自上次检查工作人员以来添加的行?
public LogForm()
{
InitializeComponent();
logWatcherTimer.Start();
}
private void logWatcherTimer_Tick(object sender, EventArgs e)
{
FileInfo log = new FileInfo(@"C:\log.txt");
if(!logWorker.IsBusy) logWorker.RunWorkerAsync(log);
}
private void logWorker_DoWork(object sender, DoWorkEventArgs e)
{
// Read only new lines since last check.
FileInfo log = (FileInfo) e.Argument;
// Here is the main question!
}
Run Code Online (Sandbox Code Playgroud)
编辑:代码解决方案(也许有更优雅的方式?):
private void logWatherWorker_DoWork(object sender, DoWorkEventArgs e)
{
// retval
string newLines = string.Empty;
FileInfo log = (FileInfo) e.Argument;
// Just skip …Run Code Online (Sandbox Code Playgroud) 我有一个int值为60的lblCountdown.我想让lblCountDown的int值减少几秒,直到达到0.
这是我到目前为止:
private int counter = 60;
private void button1_Click(object sender, EventArgs e)
{
int counter = 60;
timer1 = new Timer();
timer1.Tick += new EventHandler(timer1_Tick);
timer1.Interval = 1000; // 1 second
timer1.Start();
label1.Text = counter.ToString();
}
private void timer1_Tick(object sender, EventArgs e)
{
counter--;
if (counter == 0)
timer1.Stop();
label1.Text = counter.ToString();
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试实现像倒计时器那样在0发出警报的东西.我希望能够设置在计时器关闭之前等待的时间,我想知道是否有提供的UI小部件或元素这种选择功能.
基本上,android有没有类似iPhone的选择旋转轮?或者是否有某种类型的时间戳可以选择任意数小时和分钟?android中的timepicker小部件有一个不必要的AM/PM标签.
我是否需要实现自己的自定义UI才能实现此目的?
假如我有以下四个功能:
def foo():
subprocess.Popen('start /B someprogramA.exe', shell=True)
def bar():
subprocess.Popen('start /B someprogramB.exe', shell=True)
def foo_kill():
subprocess.Popen('taskkill /IM someprogramA.exe')
def bar_kill():
subprocess.Popen('taskkill /IM someprogramB.exe')
Run Code Online (Sandbox Code Playgroud)
如何将foo和bar功能交替运行,比如30分钟?含义:第一个30分钟 - 跑步foo,第二个30分钟 - 跑步bar,第三个30分钟 - 跑步foo,依此类推.每次新的运行应该"杀死"前一个线程/ func.
我有一个倒数计时器线程,但不知道如何"交替"这些功能.
class Timer(threading.Thread):
def __init__(self, minutes):
self.runTime = minutes
threading.Thread.__init__(self)
class CountDownTimer(Timer):
def run(self):
counter = self.runTime
for sec in range(self.runTime):
#do something
time.sleep(60) #editted from 1800 to 60 - sleeps for a minute
counter -= 1
timeout=30
c=CountDownTimer(timeout)
c.start()
Run Code Online (Sandbox Code Playgroud)
编辑:我的解决方案与尼古拉斯奈特的投入......
import …Run Code Online (Sandbox Code Playgroud) 我希望有一个类每2秒更改一次自己的私有变量.我知道,如果我做了类似的事情
import java.util.Timer;
//...
Timer timer;
//...
timer.schedule(new ChangeSomething(), 2000);
Run Code Online (Sandbox Code Playgroud)
它将ChangeSomething()在2秒后执行,有没有办法告诉它每2秒做一次,或者,如果我放进去ChangeSomething()
timer.schedule(new ChangeSomething(), 2000);
Run Code Online (Sandbox Code Playgroud)
它会起作用吗?
另一方面,究竟做timer.cancel()了什么?
我正在构建一个相当简单的应用程序,它执行一些单独的HTTPWebRequests,每个都在自己的计时器上.我不太可能需要一次运行3个以上的单独请求.
如果在另一个HTTPWebRequest正在进行时触发Timer Tick,那么Timer Tick触发的事件会发生什么?我应该添加线程吗?
System.Environment.TickCount的WinRT替代品是什么?
我有一个方法集线器,称为客户端.此方法启动一个带有委托的计时器,该委托每10秒运行一次.如果在没有人连接到集线器的情况下继续运行此委托是没有意义的,我想在重新计划之前检查是否有任何用户仍然从委托内部连接.有没有办法做到这一点?
我想在TextView中以类似[19:59]的格式显示计时器.所以当我点击开始按钮时,计时器将显示如下,例如,我想设置20分钟,它将显示为[19] :58] [19:87].谁能提出一些想法或示例代码?
.NET 6 引入了PeriodicTimer.
我需要每分钟、每分钟都做点什么。例如:09:23:00,09:24:00,09:25:00, ...
但在一分钟的时间内 -new PeriodicTimer(TimeSpan.FromMinutes(1))从 开始09:23:45,我将在以下位置得到“刻度”:09:24:45, 09:25:45, 09:26:45, ...
所以这取决于开始时间。
我的解决方法是使用一秒周期,并检查当前时间的秒数是否等于0。另一种解决方法是等待下一分钟,然后启动计时器。这两种方法都有效,但都很繁琐,并且使用的分辨率太精细。
是否有内置或更好的方法在每分钟结束时触发而不是在开始后一分钟触发?