У меня есть приложение WPF, в котором я получаю сигналы от службы WCF. Поэтому, с одной стороны, мое приложение работает хорошо, и параллельно мне нужно получить ответ от приложения WCF, поэтому, если я получу 10 ответов от службы WCF, мне нужно отменить задачу, ожидающую сигналов.
Итак, весь этот процесс работает хорошо, но когда я снова запускаю этот процесс, мне снова нужно запустить Задержку Задачи на несколько секунд, и в первый раз я отменяю задачу, используя CancellationTokenSource.Token
.
Итак, еще раз, когда я пытаюсь начать Task.Delay
, тогда я получаю Token.IsCancellationRequested = true
. Поэтому мне нужно сделать его ложным, или мне нужно снова запустить Task.Delay
.
public static System.Threading.CancellationTokenSource tokenSource = new System.Threading.CancellationTokenSource();
private void btnSubmit(object sender, RoutedEventArgs e)
{
if(tokenSource.Token.IsCancellationRequested == true)
{
startAddToPosition(tokenSource.Token);
}
else
{
startAddToPosition(tokenSource.Token);
}
}
Я передаю tokenSource
значение startAddToPosition
Задача. Так что если Token
ложно, то мое состояние не работает, поэтому мне нужно сделать tokenSource.Token.IsCancellationRequested == false
.
public static async void startAddToPosition(System.Threading.CancellationToken token)
{
try
{
MainWindow.isInLoop = true;
await Task.Delay(30000, token);
MainWindow.isInLoop = false;
}
catch(OperationCanceledException ex)
{
MainWindow.isInLoop = false;
}
}
Однако, когда startAddToPosition запускается, тогда параллельно я жду сигналов от службы WCF в течение 30 секунд, и если я получаю сигнал от службы WCF в течение 5 секунд, то я не хочу ждать оставшиеся 25 секунд. Поэтому, если я получаю сигналы от службы WCF, я отменяю задание на ожидание.
ниже HandleBroadCast работает параллельно, когда задача ожидает 30 секунд.
public static void HandleBroadcast(object sender, EventArgs e)
{
try
{
var eventData = (ServiceReference1.EventDataType)sender;
if (message != "")
message += "\r\n";
message += string.Format("{0} (from {1})",
eventData.EventMessage, eventData.ClientName);
if (isInLoop == true)
{
tokenSource.Cancel();
}
}
catch (Exception ex)
{
}
}
Поэтому, когда tokenSource становится отмененным, я перенаправляю на перехват раздела метода startAddToPosition.
Так что это весь поток, и когда я снова нажимаю кнопку отправки, он переходит к методу startAddToPosition, но получает значение tokenSource true. Так как я могу изменить значение tokenSource и
если есть какая-то лучшая идея, в которой я могу ждать 30 секунд и параллельно получать ответ от службы WCF, и если я получаю ответ от службы WCF, то мне нужно отменить этот период ожидания. Есть ли хорошее предложение, которое я должен заменить в реализации?