1

让我们考虑一种经常更改字符串包含值的方法。我需要创建每 1 分钟运行一次以从字符串中获取值的线程。

可能吗?

我尝试了以下代码,它使除该特定线程之外的整个进程休眠:

System.Threading.Thread.Sleep(10000);
4

5 回答 5

5

如果您想在定义的时间段内运行线程进程,则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);
}
于 2013-01-09T06:14:50.257 回答
1

Sleep不会启动新线程,它会在给定的毫秒数内阻塞当前线程(在您的情况下为 UI 线程)。

根据您的描述,您想启动新线程并可以在该线程中休眠。此外,使用计时器可能更容易。MSDN Thread 文章中有关 Thread 对象的完整示例和信息可用:

new Thread(ThreadFunction).Start(); 
于 2013-01-09T06:19:58.293 回答
1

利用:

new Thread(delegate()
    {
         while(true)
         {
             // Do stuff
             Thread.sleep(60000);
         }
    }).Start();

60 000 毫秒是一分钟

Thread.sleep 使当前线程进入睡眠状态

于 2013-01-09T06:12:30.890 回答
0

不是每 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 秒。

于 2013-01-09T06:22:52.817 回答
0

C# 或更特别的 .NET 支持 MULTITHREADING。

当您使用Thread.Sleep()它时,它将禁用使用的一个线程Thread.Sleep()

这是一个使用“TPL”来午餐线程的示例,该线程每 60 秒对字符串进行一次采样

System.Threading.Tasks.Task.Factory.StartNew(
()=>
{
System.Threading.Thread.Sleep(60000);
 ReadString()}
)

你应该记住,你需要保护你的字符串RACE CONDITION

为此使用 C#

于 2013-01-09T06:20:37.547 回答