Как приостановить/приостановить поток, а затем продолжить его?

Я делаю приложение на С#, которое использует winform в качестве графического интерфейса и отдельный поток, который работает в фоновом режиме, автоматически меняя вещи. Бывший:

public void Run()
{
    while(true)
    {
        printMessageOnGui("Hey");
        Thread.Sleep(2000);
        // Do more work
    } 
}

Как бы мне сделать паузу в любом месте цикла, потому что одна итерация цикла занимает около 30 секунд. Поэтому я бы не хотел приостанавливать его после выполнения одного цикла, я хочу приостановить его вовремя.


person rvk    schedule 12.03.2010    source источник


Ответы (3)


Это следует сделать с помощью ManualResetEvent.

ManualResetEvent mre = new ManualResetEvent();
mre.WaitOne();  // This will wait

В другом потоке, очевидно, вам понадобится ссылка на mre

mre.Set(); // Tells the other thread to go again

Полный пример, который напечатает некоторый текст, подождет, пока другой поток что-то сделает, а затем возобновит работу:

class Program
{
    private static ManualResetEvent mre = new ManualResetEvent(false);

    static void Main(string[] args)
    {
        Thread t = new Thread(new ThreadStart(SleepAndSet));
        t.Start();

        Console.WriteLine("Waiting");
        mre.WaitOne();
        Console.WriteLine("Resuming");
    }

    public static void SleepAndSet()
    {
        Thread.Sleep(2000);
        mre.Set();
    }
}
person Ian    schedule 04.07.2013

Вы можете приостановить поток, вызвав thread.Suspend, но это не рекомендуется. Я бы посмотрел на autoresetevent для выполнения вашего синхронизация.

person rerun    schedule 12.03.2010

person    schedule
comment
Краткое примечание: как написано, этот пример запустится в состоянии паузы (как указано в строке new ManualResetEvent(false);). Спасибо @Lirik - person July.Tech; 20.01.2017
comment
я тоже столкнулся с той же проблемой .. Большое спасибо @Lirik. ваша душа работала и на меня. - person VARUN NAYAK; 09.06.2017