2016-11-22 1 views
0

Проблема: У меня есть программа, которая читает текстовый файл сценария с некоторыми командами, которые отправляются на некоторое аппаратное обеспечение через последовательный порт. Например. Переместите робот на 10 секунд. В сценарии у меня есть некоторые ключевые слова, например. #delay, которые распознаются функцией, которая анализирует скрипт и принимает некоторые меры при обнаружении ключевых слов «#». В случае задержки я хочу отложить за X миллисекунды, не отменяя пользовательский интерфейс, поэтому я могу приостановить или остановить скрипт, если он запущен. В настоящее время используется Thread.Sleep, от которого я хочу избавиться.C# Последовательная задержка без блокировки UI

Попытки: Я пытался использовать таймеры, такие как:

public void delay(int ms) { 
     System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); 
     timer.Interval = ms; 
     timer.Tick += (s, o) => {timer.Enabled = false; timer.Dispose(); Application.DoEvents();}; 
     timer.Enabled = true; 
    } 

Или:

// Delay Function 
    private void delay(int ms) 
    { 
     if (ms < 100) return; 
     DateTime delay_amount = DateTime.Now.AddMilliseconds(ms); 
     while (DateTime.Now < delay_amount) { 
      Application.DoEvents(); 
     } 
    } 

Я попытался запустить скрипт функцию чтения на новую тему, но я не могу потому, что он использует некоторые comboboxes, которые используются основной нитью ... Все эти решения продолжают делать мой пользовательский интерфейс невосприимчивым. Может кто-нибудь, пожалуйста, помогите мне? Моя цель - .NET 4.0.

+1

использования 'ждет Task.Delay' и изменить называемый метод для' частных async' перед использованием 'await' ключевого слова. – Fabio

+0

Создать новый поток и использовать Invoke для доступа к comboboxes в потоке пользовательского интерфейса –

+0

Создайте собственный поток (класс) для обработки скрипта. Используйте пользовательский интерфейс только для управления им, состояния чтения/прогресса и т. Д. – apocalypse

ответ

0

// Пытается работать по этим направлениям:

async Task MyMainMethod() 
{ 

    await Task.Run(()=> delay(1000)); 

} 
+0

Я думал, вам нужно использовать .NET 4.5 для асинхронизации? – Filip

+0

Отметьте этот ответ: http://stackoverflow.com/questions/9110472/using-async-await-on-net-4 – agfc

+0

Кажется глупым пройти столько неприятностей за такую ​​простую вещь. Я думаю, мне нужно руководствоваться тем, что вместо этого нужно создать другой поток. – Filip

Смежные вопросы