您的程序的当前结构不支持您要实现的目标。
当您调用Thread.Sleep(int)时,它会将当前线程挂起指定的时间。默认情况下,您的程序仅作为单个线程运行,因此暂停该线程会阻止您的所有代码运行。
您希望向用户显示更新,但您还希望您的工作进程在两次运行之间等待 5 分钟。这意味着您将需要为工作进程创建一个单独的线程,并从您的程序开始的线程中管理它。
正如其他人所建议的那样,一种更简单的方法是使用System.Threading.Timer 。在您的情况下,您可以将代码更改为如下所示:
class Program
{
static void Main(string[] args)
{
Program program = new Program();
program.startFeed();
}
// This is run on the main thread
public void startFeed()
{
// Start a Timer on a new thread to do work with the ProcessData method
// Pass null to its 'state' argument, wait 0 milliseconds before
// running it, and run it once every 300000 milliseconds
using (new Timer(ProcessData, null, 0, 300000))
{
// The Timer will only exist while we are inside the 'using' block;
// stay here with a loop
while (true)
{
// Write our status message
Console.WriteLine("Waiting for data at {0}...", DateTime.Now);
// We don't want this loop running ALL the time; add a small
// delay so it only updates once every second
Thread.Sleep(1000);
}
}
}
// This is run on the background thread
private void ProcessData(object state)
{
try
{
//My Application which i want to run continously
//when thread enters in run mode
}
catch (Exception xObj)
{
Console.WriteLine(DateTime.Now.ToString()
+ " >> Incoming Message Processing Error. >> "
+ xObj.Message);
}
}
}
太好了,所以现在您有两个线程同时运行,并且在一个线程上调用Thread.Sleep(int)不会影响另一个线程。请注意,您不需要在ProcessData中调用Thread.Sleep(int),因为Timer会为您处理这些。
最后,您希望准确地向用户显示ProcessData何时再次运行。您可以通过将DateTime字段添加到您的Program类来做到这一点,比如在ProcessDataprivate DateTime _lastRun;
的开头,您可以将其设置为. 然后,在startFeed的循环中,您可以使用类似.DateTime.Now
_lastRun.AddMinutes(5).Subtract(DateTime.Now).Seconds
这里可以说的还有很多。正如其他人所暗示的那样,您正在编写轮询代码而不是事件驱动代码。轮询通常比事件驱动的等效项更慢、效率更低且更复杂。但是,这取决于您的数据源是否能够在有新数据要处理时通知您的代码;投票可能是您唯一的选择。
关于线程之间的通信也有很多话要说。就其本身而言,多线程是一个非常棘手的主题,并且是许多难以发现的错误的原因。但是,对于此示例,写入控制台并设置共享的 DateTime 字段在两个线程之间应该是安全的。