Мне нравится Решение загадки .Если вы знаете System.Reactive
, это выбор goog.
Это простое решение с использованием асинхронной задачи.
Я перехожу к асинхронному методу:
- List<Tuple<int, int>>
который представляет пробелы и длительности сигналов
- Control
- отношение, которое будет служить визуальным выходным сигналом
- CancellationToken
, используемое для сигнализации о завершении задачи.
Задание можно отменить, затем начать заново с той же последовательностью или новой.
Если не отменено, задание будет продолжаться бесконечно, воспроизводить текущую последовательность.
Здесь я использую кнопку для запуска задачи.Я мог бы быть чем угодно.
Обратите внимание, что я немного изменил последовательность и время.Пауза между каждой итерацией последовательности находится в конце последовательности, поэтому он запускает сигнал немедленно, а затем приостанавливает его после выполнения каждой последовательности.
Когда выдается запрос на отмену, Задача будетзавершите последовательность перед отменой:
if (token.IsCancellationRequested) return;
проверяется только после завершения последовательности, чтобы избежать путаницы с таймингами.Но это можно изменить, чтобы проверять отмену после каждой длительной паузы.
CancellationTokenSource source;
CancellationToken token;
private void button1_Click(object sender, EventArgs e)
{
if (source != null)
{
source.Cancel();
source.Dispose();
source = null;
return;
}
source = new CancellationTokenSource();
token = source.Token;
List<Tuple<int, int>> MorseCodeSequence = new List<Tuple<int, int>>()
{
new Tuple<int, int>(1200, 200),
new Tuple<int, int>(400, 200),
new Tuple<int, int>(1200, 200),
new Tuple<int, int>(400, 2000)
};
Task.Run(()=> MorseSequence(MorseCodeSequence, this.btnMorse, token));
}
public async Task MorseSequence(List<Tuple<int, int>> MorseSequence, Control MorseCodeOutputObject, CancellationToken token)
{
while (true)
{
foreach (Tuple<int, int> MorseTiming in MorseSequence)
{
MorseCodeOutputObject.BeginInvoke(new MethodInvoker(() =>
{ MorseCodeOutputObject.BackColor = Color.Cyan; }));
await Task.Delay(MorseTiming.Item1);
MorseCodeOutputObject.BeginInvoke(new MethodInvoker(() =>
{ MorseCodeOutputObject.BackColor = Color.Gray; }));
await Task.Delay(MorseTiming.Item2);
}
if (token.IsCancellationRequested) return;
};
}
Последовательность SOS
List<Tuple<int, int>> SOSMorseSequence = new List<Tuple<int, int>>()
{
new Tuple<int, int>(400, 200),
new Tuple<int, int>(400, 200),
new Tuple<int, int>(400, 300),
new Tuple<int, int>(1200, 200),
new Tuple<int, int>(1200, 200),
new Tuple<int, int>(1200, 300),
new Tuple<int, int>(400, 200),
new Tuple<int, int>(400, 200),
new Tuple<int, int>(400, 2000),
};