Удалить время задержки: System.Threading.Thread.Sleep с помощью c # (включая код) - PullRequest
1 голос
/ 21 ноября 2011

У меня есть приложение winform, которое показывает некоторую информацию во времени, каждый раз, когда оно загружает данные, я установил время задержки 7 секунд, например: System.Threading.Thread.Sleep (7000), чтобы информация могла быть просмотрена , Я хочу, чтобы у меня была кнопка, которая позволяла бы мне переходить к следующей информации без ожидания.

Я использую следующую логику: получить информацию, если она есть, ждать 7 секунд, следующие данные и так далее. Поэтому, если я нажму кнопку, я бы хотел установить это время на 0.

Есть ли способ отменить период ожидания?

вот код:

ManualResetEvent wait_handle = new ManualResetEvent(true);

{...}

private void TheLoop(object stateinfo)
    {
        bool hasInfo = true;            
        bool hasLines = GetLinesOnProduction();
        while (doLoop)
        {
            wait_handle.WaitOne();

            if (hasLines)
            {
                param1 = Lines[CurrentLine].line;
                param2 = Lines[CurrentLine].WO;

                //Here I query the DB for the CurrentLine Data                    
                ShowLineInformation(CurrentLine);
                ShowChartByHour(param1, param2, out hasInfo);
                if (hasInfo)
                    System.Threading.Thread.Sleep(7000);                                        
                //Here I move to the next line
                if (CurrentLine < Lines.Count - 1)
                    CurrentLine++;
                else
                {

                    CurrentLine = 0;  //Start all over again
                    hasLines = GetLinesOnProduction();
                }
            }
            else
            {
                System.Threading.Thread.Sleep(40000);  //(No Lines)Wait to query for lines again
                hasLines = GetLinesOnProduction();
            }
        }
    }

private void btnPauseResume_Click(object sender, EventArgs e)
    {
        if (btnPauseResume.Text == "Pause")
        {
            btnPauseResume.Text = "Resume";
            wait_handle.Reset();
        }
        else
        {
            btnPauseResume.Text = "Pause";
            wait_handle.Set();
        }
    }

Ответы [ 4 ]

3 голосов
/ 21 ноября 2011

Вместо выполнения Thread.Sleep вы можете использовать событие ожидания и просто установить его, чтобы отменить ожидание. Примерно так:

var waiter = new AutoResetEvent(false);
bool wasCanceled = waiter.WaitOne(7000);
if(wasCanceled)
    // Jump to next...


// Cancel the wait from another thread
waiter.Set()
2 голосов
/ 21 ноября 2011

Вместо использования Thread.Sleep, который приостановит все действия в вашем пользовательском интерфейсе, вместо этого используйте timer . С помощью таймера пользовательский интерфейс может по-прежнему реагировать на события, пока ваш таймер обратный вызов находится в режиме ожидания, а когда вы нажимаете кнопку, вы можете отменить таймер.

0 голосов
/ 21 ноября 2011

Вы можете использовать ManualResetHandle :

// Declare it as class member
ManualResetHandle _manualResetHandle = new ManualResetHandle();

// Wait in your process for seven seconds, or until it is Set()
_manualResetHandle.WaitOne(7000);

// Set() it in your click event handler:
_manualResetHandle.Set();
0 голосов
/ 21 ноября 2011

Я бы установил задержку путем lock, используя object, а затем запустив Monitor.Wait с задержкой в ​​7 секунд. Затем из формы, когда кнопка нажата, lock the object и выполните Monitor.PulseAll .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...