Проблема: У меня есть программа, которая читает текстовый файл сценария с некоторыми командами, которые отправляются на некоторое аппаратное обеспечение через последовательный порт. Например. Переместите робот на 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.
использования 'ждет Task.Delay' и изменить называемый метод для' частных async' перед использованием 'await' ключевого слова. – Fabio
Создать новый поток и использовать Invoke для доступа к comboboxes в потоке пользовательского интерфейса –
Создайте собственный поток (класс) для обработки скрипта. Используйте пользовательский интерфейс только для управления им, состояния чтения/прогресса и т. Д. – apocalypse