让我们考虑一种经常更改字符串包含值的方法。我需要创建每 1 分钟运行一次以从字符串中获取值的线程。
可能吗?
我尝试了以下代码,它使除该特定线程之外的整个进程休眠:
System.Threading.Thread.Sleep(10000);
让我们考虑一种经常更改字符串包含值的方法。我需要创建每 1 分钟运行一次以从字符串中获取值的线程。
可能吗?
我尝试了以下代码,它使除该特定线程之外的整个进程休眠:
System.Threading.Thread.Sleep(10000);
如果您想在定义的时间段内运行线程进程,则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);
}
Sleep
不会启动新线程,它会在给定的毫秒数内阻塞当前线程(在您的情况下为 UI 线程)。
根据您的描述,您想启动新线程并可以在该线程中休眠。此外,使用计时器可能更容易。MSDN Thread 文章中有关 Thread 对象的完整示例和信息可用:
new Thread(ThreadFunction).Start();
利用:
new Thread(delegate()
{
while(true)
{
// Do stuff
Thread.sleep(60000);
}
}).Start();
60 000 毫秒是一分钟
Thread.sleep 使当前线程进入睡眠状态
不是每 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 秒。
C# 或更特别的 .NET 支持 MULTITHREADING。
当您使用Thread.Sleep()
它时,它将禁用使用的一个线程Thread.Sleep()
这是一个使用“TPL”来午餐线程的示例,该线程每 60 秒对字符串进行一次采样
System.Threading.Tasks.Task.Factory.StartNew(
()=>
{
System.Threading.Thread.Sleep(60000);
ReadString()}
)
你应该记住,你需要保护你的字符串RACE CONDITION
为此使用 C#锁