Отмена токена только для одной задачи из списка задач - PullRequest
0 голосов
/ 24 апреля 2018

В одном из моих проектов у меня есть требование добавлять Задачи для каждой новой записи, которую мы добавляем для клиента, и эти задачи создаются с использованием параметров LongRunning, так что, когда мы получаем любой запрос от этого клиента, все эти запросы должны обрабатываться из Только бэкэнд-сервис.

Ниже приведен пример кода, в котором я добавляю клиента в задачу, а когда клиент не хочет связываться с нами, мы удаляем его из задачи

публичный словарь _cancellationTokenSourcesForChannels = new Dictionary ();

public void AddCustomerToTask(int custId, CancellationToken cancelToken)
    {            
        var cust = custSvc.SessionFactory.OpenSession().Get<Customer>(custId);
        var custModel = new CustomerModel().FromCustomer(cust);

        var tokenSource = new CancellationTokenSource();
        var taskPoller = new Task(() => WindowsService.Start(custModel), tokenSource.Token,
            TaskCreationOptions.LongRunning);
        taskPoller.Start();

        //Maintaining list of cancellationTokenSource in Dictionary
        if (_cancellationTokenSourcesForChannels == null)
            _cancellationTokenSourcesForChannels = new Dictionary<int, CancellationTokenSource>();
        if (_cancellationTokenSourcesForChannels.ContainsKey(custId))
            _cancellationTokenSourcesForChannels.Remove(custId);

        _cancellationTokenSourcesForChannels.Add(custId, tokenSource);
    }

    public void RemoveCustomerFromTask(int custId)
    {
        CancellationTokenSource currentToken;
        if (_cancellationTokenSourcesForChannels.ContainsKey(custId))
        {
            _cancellationTokenSourcesForChannels.TryGetValue(custId, out currentToken);
            currentToken?.Cancel();
        }
        if (_cancellationTokenSourcesForChannels.ContainsKey(custId))
            _cancellationTokenSourcesForChannels.Remove(custId);
    }

Итак, мой вопрос заключается в том, что когда я делаю запрос на удаление клиента, который не хочет связываться, я звоню RemoveCustomerFromTask (custId), тогда в основном код пытается отменить задачу для этого клиента. Но что интересно, он отменяет все задачи, которые были созданы и для других клиентов.

Не могли бы вы помочь мне здесь, как исправить мою проблему?

Я сохраняю список canceltoken в словаре для удаления при вызове метода RemoveCustomerFromTask.

1 Ответ

0 голосов
/ 26 марта 2019

Я закончил тем, что создал все задачи в словаре вместе с их токенами отмены. Всякий раз, когда мне требуется отменить любые такты, я получаю это из словаря и останавливаюсь и отменяю, используя свой собственный токен отмены.

Словарь использует мой собственный класс, который содержит информацию о задачах и токенах отмены.

...