Отменить токен только для одной задачи из списка задач

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

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

общедоступный словарь _cancellationTokenSourcesForChannels = новый словарь();

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), тогда в основном код пытается отменить задачу для этого клиента. Но что интересно, он также отменяет все задачи, которые были созданы для других клиентов.

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

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


person CSharpDev    schedule 24.04.2018    source источник


Ответы (1)


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

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

person CSharpDev    schedule 26.03.2019