我对编码比较陌生; 我的大多数"工作"都只是简单的GUI应用程序,它只能用于一件事,所以我没有必要进行多少操作.
无论如何,我想知道线程的一件事是,如果你想让一个线程永远活着去做它正在做的任何工作(处理,等待输入,等等),那么格式化它是正常的:
while (true) {
// do stuff
Thread.Sleep(1000);
}
Run Code Online (Sandbox Code Playgroud)
(或类似的规定)...?或者这是不安全的,如果可能的话应该避免吗?
有很多人说使用a Timer而不是Thread.Sleep(...)in Azure Worker Role.没有这方面的问题.
我正在努力理解的是如何编写代码.
目前,我有以下(pseduo代码)
_timer.Elapsed += (sender, args) => DoWork();
public override void Run()
{
while(true)
{
DoWork();
}
}
public void DoWork()
{
try
{
_timer.Stop();
// Now - do stuff ....
}
catch(....) { ... }
_timer.Start()
}
Run Code Online (Sandbox Code Playgroud)
会发生什么,是代码进入DoWork()方法一次,然后DoesStuff(tm)..罚款..启动计时器(比如......间隔30秒),然后退出该方法.
然后,它返回到main Run()循环中的main 方法.所以它立即回来并DoWork()再次进入方法..而不是等待计时器将其关闭.
所以我不确定如何Thread.Sleep(...)用Timers 替换任何.
有线索吗?
我不想退出Run()方法:)我很高兴永远保持循环.我坚持使用的是替换标准Thread.Sleep(...)调用(阻塞线程)并将其替换Timer为大多数人建议的.
请不要链接或建议我cancelSource.Token.WaitHandle.WaitOne();作为解决方案使用.这不是我想在这里实现的.请注意帖子标题!
我有一个Windows服务,它基本上是访问邮箱和阅读电子邮件.我试图找出每隔x秒检查一次邮箱的最佳方法.
一种方法是调用Thread.Sleep,然后再次调用Start方法,例如
protected override void OnStart(string[] args)
{
// get config settings
CheckMailbox();
}
public void CheckMailbox()
{
int x = 5000;
// do stuff
Thread.Sleep(x);
CheckMailbox();
}
Run Code Online (Sandbox Code Playgroud)
不确定这是否是最佳方式.为了进一步探讨这一点,我了解您可以通过WCF公开服务来调用Windows服务.在这种情况下,如果一个名为Process的Web应用程序启动,那么我会纠正Threads吗?那我怎么处理呢?我每次都要创建一个新线程并将其放入队列吗?