暂停的方法为毫秒集#(Pausing a method for set # of milliseco

2019-07-29 11:15发布

我需要做一个排序“超时”或在我的10秒(10000毫秒)方法暂停,但我不知道,如果以下会工作,因为我没有多线程。

Thread.Sleep(10000);

我会尝试使用当前的代码,但我将不胜感激,如果有人可以解释这样做的最好的和正确的方法,特别是如果上面的代码不能正常工作。 谢谢!

更新 :这个程序实际上是在相关的功能正在做许多HTTPWebRequests到一个服务器控制台应用程序,所以我希望推迟他们指定的毫秒数量。 因此,不需要回调 - 所有需要的是一个“无条件暂停” - 基本上就是整个事情停止10秒钟,然后不断去。 我很高兴的是C#仍然认为这是一个线程,这样的Thread.Sleep(...)会工作。 谢谢大家!

Answer 1:

您可能没有 -threading,但你还是一个线程中执行:所有的代码执行一个线程。

调用Thread.Sleep的确将暂停当前线程。 你真的希望它无条件地暂停10秒,或者你想能够被“唤醒”,由别的东西怎么回事? 如果你只有真正使用一个线程,调用Sleep可能是前进的最好方式,但会视情况而定。

特别是,如果你正在写一个GUI应用程序,你不想使用Thread.Sleep从UI线程,否则你的整个应用程序将变得没有反应,持续10秒。

如果你可以给你的应用程序的详细信息,这将有助于我们劝你更好。



Answer 2:

那的确将暂停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过,但国际海事组织是混乱。



Answer 3:

你可以使用一个单独的线程来做到这一点:

   ThreadPool.QueueUserWorkItem(
       delegate(object state)
       {
           Thread.Sleep(1000);
           Console.WriteLine("done");
       });

但是,如果这是一个Windows窗体应用程序,则需要从GUI线程的延迟之后调用的代码(本文,例如: ?如何更新从C#另一个线程的GUI )。

[编辑]刚看到您的更新。 如果它是一个控制台应用程序,那么这将正常工作。 但是,如果你还没有使用多线程到目前为止,那么你需要知道,这个代码将在不同的线程中执行,这意味着你将不得不采取有关线程同步问题的照顾。

如果您不需要背景的工人,坚持“保持简单”。



Answer 4:

下面是暂停类,将暂停所需毫秒,不会占用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;
    }
}


Answer 5:

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使用率(当然,在多核系统是一个核心)上运行。



Answer 6:

是的,这工作得很好。

你不必有多个线程使用一些在Thread类的方法。 你总是有至少一个线程。



Answer 7:

对于超时,你应该有一个静态的挥发性布尔isRunning类字段。 当新线程开始,,将isRunning必须变成现实,并在年底必须成为假。

主线程应该有一个循环为您定义的超时期间,将isRunning的方法。 当超时结束,你应该实现的逻辑。 但是,从来没有使用中止线程方法。

停顿......没有一个简单的解决方案。 这取决于你的线程里面做什么。 但是,你可以看看Monitor.Wait 。



文章来源: Pausing a method for set # of milliseconds