我需要做一个排序“超时”或在我的10秒(10000毫秒)方法暂停,但我不知道,如果以下会工作,因为我没有多线程。
Thread.Sleep(10000);
我会尝试使用当前的代码,但我将不胜感激,如果有人可以解释这样做的最好的和正确的方法,特别是如果上面的代码不能正常工作。 谢谢!
更新 :这个程序实际上是在相关的功能正在做许多HTTPWebRequests到一个服务器控制台应用程序,所以我希望推迟他们指定的毫秒数量。 因此,不需要回调 - 所有需要的是一个“无条件暂停” - 基本上就是整个事情停止10秒钟,然后不断去。 我很高兴的是C#仍然认为这是一个线程,这样的Thread.Sleep(...)会工作。 谢谢大家!
您可能没有多 -threading,但你还是一个线程中执行:所有的代码执行一个线程。
调用Thread.Sleep
的确将暂停当前线程。 你真的希望它无条件地暂停10秒,或者你想能够被“唤醒”,由别的东西怎么回事? 如果你只有真正使用一个线程,调用Sleep
可能是前进的最好方式,但会视情况而定。
特别是,如果你正在写一个GUI应用程序,你不想使用Thread.Sleep
从UI线程,否则你的整个应用程序将变得没有反应,持续10秒。
如果你可以给你的应用程序的详细信息,这将有助于我们劝你更好。
那的确将暂停10秒,执行的线程/方法。 你看到一个具体的问题?
请注意,你不应该Sleep
在UI线程-这将是更好的做一个回调来代替。
也有允许简单的访问得到它去(如果你发现这是2秒后OK)阻塞线程的其他方式注; 如Monitor.Wait(obj, 10000)
允许其他线程Pulse
如果需要唤醒它):
static void Main() {
object lockObj = new object();
lock (lockObj) {
new Thread(GetInput).Start(lockObj);
Monitor.Wait(lockObj, 10000);
}
Console.WriteLine("Main exiting");
}
static void GetInput(object state) {
Console.WriteLine("press return...");
string s = Console.ReadLine();
lock (state) {
Monitor.Pulse(state);
}
Console.WriteLine("GetInput exiting");
}
你可以做到这一点Thread.Interrupt
过,但国际海事组织是混乱。
你可以使用一个单独的线程来做到这一点:
ThreadPool.QueueUserWorkItem(
delegate(object state)
{
Thread.Sleep(1000);
Console.WriteLine("done");
});
但是,如果这是一个Windows窗体应用程序,则需要从GUI线程的延迟之后调用的代码(本文,例如: ?如何更新从C#另一个线程的GUI )。
[编辑]刚看到您的更新。 如果它是一个控制台应用程序,那么这将正常工作。 但是,如果你还没有使用多线程到目前为止,那么你需要知道,这个代码将在不同的线程中执行,这意味着你将不得不采取有关线程同步问题的照顾。
如果您不需要背景的工人,坚持“保持简单”。
下面是暂停类,将暂停所需毫秒,不会占用CPU资源的占用。
public class PauseClass
{
//(C) Michael Roberg
//Please feel free to distribute this class but include my credentials.
System.Timers.Timer pauseTimer = null;
public void BreakPause()
{
if (pauseTimer != null)
{
pauseTimer.Stop();
pauseTimer.Enabled = false;
}
}
public bool Pause(int miliseconds)
{
ThreadPriority CurrentPriority = Thread.CurrentThread.Priority;
if (miliseconds > 0)
{
Thread.CurrentThread.Priority = ThreadPriority.Lowest;
pauseTimer = new System.Timers.Timer();
pauseTimer.Elapsed += new ElapsedEventHandler(pauseTimer_Elapsed);
pauseTimer.Interval = miliseconds;
pauseTimer.Enabled = true;
while (pauseTimer.Enabled)
{
Thread.Sleep(10);
Application.DoEvents();
//pausThread.Sleep(1);
}
pauseTimer.Elapsed -= new ElapsedEventHandler(pauseTimer_Elapsed);
}
Thread.CurrentThread.Priority = CurrentPriority;
return true;
}
private void pauseTimer_Elapsed(object sender, ElapsedEventArgs e)
{
pauseTimer.Enabled = false;
}
}
Thread.sleep代码是好的,据我所知的正确方法。 即使你是不是多线程:总有至少一个线程,如果您发送睡觉,它睡觉。
另一个( 坏 )的方式是一个自旋锁 ,是这样的:
// Do never ever use this
private void DoNothing(){ }
private void KillCPU()
{
DateTime target = DateTime.Now.AddSeconds(10);
while(DateTime.Now < target) DoNothing();
DoStuffAfterWaiting10Seconds();
}
这是可悲的是仍然被人们所使用,虽然它会阻止你的程序10秒,将在100%的CPU使用率(当然,在多核系统是一个核心)上运行。
是的,这工作得很好。
你不必有多个线程使用一些在Thread类的方法。 你总是有至少一个线程。
对于超时,你应该有一个静态的挥发性布尔isRunning类字段。 当新线程开始,,将isRunning必须变成现实,并在年底必须成为假。
主线程应该有一个循环为您定义的超时期间,将isRunning的方法。 当超时结束,你应该实现的逻辑。 但是,从来没有使用中止线程方法。
停顿......没有一个简单的解决方案。 这取决于你的线程里面做什么。 但是,你可以看看Monitor.Wait 。