【发布时间】:2012-12-23 03:32:07
【问题描述】:
让我们考虑一个经常改变字符串包含值的方法。 我需要创建每 1 分钟运行一次以从字符串中获取值的线程。
有可能吗?
我尝试了以下代码,它使除特定线程之外的整个进程休眠:
System.Threading.Thread.Sleep(10000);
【问题讨论】:
标签: c# .net multithreading
让我们考虑一个经常改变字符串包含值的方法。 我需要创建每 1 分钟运行一次以从字符串中获取值的线程。
有可能吗?
我尝试了以下代码,它使除特定线程之外的整个进程休眠:
System.Threading.Thread.Sleep(10000);
【问题讨论】:
标签: c# .net multithreading
用途:
new Thread(delegate()
{
while(true)
{
// Do stuff
Thread.sleep(60000);
}
}).Start();
60000 毫秒是一分钟
Thread.sleep 使当前线程进入睡眠状态
【讨论】:
如果您想在定义的时间段内运行线程进程,System.Threading.Timer 类将是完美的
var timer = new System.Threading.Timer((o) =>
{
// do stuff every minute(60000ms)
}, null, 0, 60000);
但是,如果您要从该线程更新任何 UI 代码不要忘记在 UI 线程上调用回
WPF:
var timer = new System.Threading.Timer((o) =>
{
Dispatcher.Invoke(DispatcherPriority.Normal, (Action)delegate
{
// do stuff WPF UI safe
});
}, null, 0, 60000);
Winform
var timer = new System.Threading.Timer((o) =>
{
base.Invoke((Action)delegate
{
// do stuff Winforms UI safe
});
}, null, 0, 60000);
例子:
private void StartUpdateTimer()
{
var timer = new System.Threading.Timer((o) =>
{
string ss = "gowtham " + DateTime.Now.ToString();
Response.Write(ss);
}, null, 0,1000);
}
【讨论】:
do stuff 正在使用 UI,那么您还需要进入 UI 线程。见stackoverflow.com/questions/253138/…
Sleep 不会启动新线程,它会阻塞当前线程(在您的情况下为 UI 线程)给定的毫秒数。
根据您的描述,您想启动新线程并可以在该线程中休眠。此外,使用计时器可能更容易。 MSDN Thread article 中提供了有关 Thread 对象的完整示例和信息:
new Thread(ThreadFunction).Start();
【讨论】:
C# 或更多特别是 .NET 支持 MULTITHREADING。
当您使用Thread.Sleep() 时,它将禁用使用Thread.Sleep() 的线程
这里是使用'TPL' 午餐线程的示例,该线程每 60 秒对字符串进行一次采样
System.Threading.Tasks.Task.Factory.StartNew(
()=>
{
System.Threading.Thread.Sleep(60000);
ReadString()}
)
你应该记住,你需要保护你的字符串免受RACE CONDITION
为此使用 C# lock
【讨论】:
不是每 60 秒启动一个新线程,而是使用一个线程,它在完成后休眠直到下一次运行。像这样的:
Class Main{
public void startObserverThread(){
Thread t = new Thread(this.observerThread);
t.start();
}
private DateTime lastRun = null;
public void observerThread(){
if (lastRun == null || DateTime.Now.Subtract(lastRun).Seconds >= 60){
lastRun = DateTime.Now;
//do thread work.
}else{
//check every second, if time elapsed
Thread.sleep(1000);
}
}
}
如果需要更准确,请更改等待时间。 与在线程末尾重新安排新线程相比,最大的优势在于,您不需要关心任务本身的执行时间。如果需要 10 秒,线程将休眠 50 秒。如果需要 50 秒,则线程在完成任务工作后仅休眠 10 秒。
【讨论】: