Как решить ошибку для CancellationTokenSource был устранен с несколькими CancellationTokenSource в c # - PullRequest
0 голосов
/ 02 июля 2019

Я генерирую несколько задач для обработки различными методами.Хотя некоторые методы достигают результата, мне нужно отменить эту задачу.С этой целью я генерирую и назначаю CancellationTokenSource для каждой задачи.Когда задача достигает своего результата, я могу отменить эту задачу.

Во время этой реализации я получаю сообщение об ошибке типа 'The CancellationTokenSource has been disposed.' Я установил отладчик и проверил его значение, но не смог найти основную причину.этой ошибки.Как мы можем справиться с этой ошибкой?Мне нужно ваше лучшее предложение для этого.

//Create class for handle cancellationTokenSource with each Task individually
 public class tempTask
 {
    public string symbolName { get; set; }
    public System.Threading.CancellationTokenSource cts { get; set; }
    public Task task { get; set; }
 }

//Declaration of CTS, Binding Object Class
public static System.Threading.CancellationTokenSource _tokenSource = new System.Threading.CancellationTokenSource();
public static Dictionary<string, System.Threading.CancellationTokenSource> test = new Dictionary<string, System.Threading.CancellationTokenSource>();
public static List<tempTask> tempTasks = new List<tempTask>();

// In first method : creating object of CTS and sending as a parameter
_tokenSource = new System.Threading.CancellationTokenSource();
startAddToPosition(_tokenSource, _symbolName);

//In startAddToPosition method : Assigning TokenSource to Task
public static async void startAddToPosition(System.Threading.CancellationTokenSource cts1, string symbolName)
{
   try
   {
      Task t1 = Task.Run(() => Task.Delay(30000, cts1.Token), cts1.Token);

      tempTask tmp = new tempTask
      {
         cts = cts1,
         task = t1,
         symbolName = symbolName
      };
      tempTasksList.Add(tmp);
   }
   catch(Exception ex)
   {
       //Below line throwing an error `'The CancellationTokenSource has been disposed.'

       var symName = test.FirstOrDefault(q => q.Value.Token == ex.CancellationToken).Key;
                generateRealPosition(symName);
   }
}

Итак, есть ли какая-то часть, которую мне не хватает, чтобы добавить в мой код для решения этой проблемы?

...