仅为任务列表中的一项任务取消令牌
Cancel token only for one task out of list of tasks
在我的一个项目中,我需要为我们为客户添加的每个新条目添加任务,这些任务是使用 LongRunning 选项创建的,因此当我们收到来自该客户的任何请求时,所有这些请求都需要仅从后端服务处理。
下面是示例代码片段,我将客户添加到任务中,当客户不想与我们关联时,我们会从任务中删除
public Dictionary
_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),然后基本上代码试图取消该客户的任务。但有趣的是,它也取消了为其他客户创建的所有任务。
有谁能帮我解决一下我的问题吗?
我在调用 RemoveCustomerFromTask 方法时将要删除的 canceltoken 列表维护到字典中。
我最终为字典创建了所有任务及其取消标记。每当我需要取消任何任务时,我都会从字典中获取它并使用它自己的取消令牌停止和取消。
字典使用我自己的class,其中包含任务和取消令牌信息。
在我的一个项目中,我需要为我们为客户添加的每个新条目添加任务,这些任务是使用 LongRunning 选项创建的,因此当我们收到来自该客户的任何请求时,所有这些请求都需要仅从后端服务处理。
下面是示例代码片段,我将客户添加到任务中,当客户不想与我们关联时,我们会从任务中删除
public Dictionary _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),然后基本上代码试图取消该客户的任务。但有趣的是,它也取消了为其他客户创建的所有任务。
有谁能帮我解决一下我的问题吗?
我在调用 RemoveCustomerFromTask 方法时将要删除的 canceltoken 列表维护到字典中。
我最终为字典创建了所有任务及其取消标记。每当我需要取消任何任务时,我都会从字典中获取它并使用它自己的取消令牌停止和取消。
字典使用我自己的class,其中包含任务和取消令牌信息。