Как перезапустить CancellationTokenSource после того, как отменить его в c #? - PullRequest
0 голосов
/ 10 мая 2019

У меня есть приложение 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, то мне нужно отменить этот период ожидания. Есть ли хорошее предложение, которое я должен заменить в реализации?

1 Ответ

2 голосов
/ 11 мая 2019

Вы "перезапускаете" CancellationTokenSource, создавая новый:

tokenSource = new System.Threading.CancellationTokenSource();

Но, как упоминал Панагиотис, может быть лучшее решение, если вы опишите реальную проблему, которую пытаетесь решить.

...