【发布时间】:2015-01-11 14:07:10
【问题描述】:
这是对我之前的一个问题here 的跟进。总之,我试图为这种情况提出一个无锁设计,在取消任务时我想调用第三方库的方法。在回答我的问题时,一位乐于助人的 SO 参与者建议使用 CancellationToken.Register,但我不确定在哪里以及如何在此处使用它。下面是我想出的代码。如果您发现此方法有任何问题,或者是否有更好的替代方案可以解决此问题,请告诉我。
class ProcessEmployees
{
private List<Employee> _Employees;
CancellationTokenSource cs = new CancellationTokenSource();
public ProcessEmployees()
{
_Employees = new List<Employee>()
{
new Employee() { ID = 1, FirstName = "John", LastName = "Doe" },
new Employee() { ID = 2, FirstName = "Peter", LastName = "Saul" },
new Employee() { ID = 3, FirstName = "Mike", LastName = "Sue" },
new Employee() { ID = 4, FirstName = "Catherina", LastName = "Desoza" },
new Employee() { ID = 5, FirstName = "Paul", LastName = "Smith" }
};
}
public void StartProcessing()
{
try
{
Task[] tasks = this._Employees.AsParallel().WithCancellation(cs.Token).Select(x => this.ProcessThisEmployee(x, cs.Token)).ToArray();
Task.WaitAll(tasks);
}
catch (AggregateException ae)
{
// error handling code
}
// other stuff
}
private async Task ProcessThisEmployee(Employee x, CancellationToken token)
{
ThirdPartyLibrary library = new ThirdPartyLibrary();
if (token.IsCancellationRequested)
token.ThrowIfCancellationRequested();
await Task.Factory.StartNew(() => library.SomeAPI(x) );
if (token.IsCancellationRequested)
{
library.Clean();
token.ThrowIfCancellationRequested();
}
}
}
【问题讨论】:
-
为什么要在操作完成之后检查取消?假设大部分处理时间都花在
SomeAPI()方法中,那么在ProcessThisEmployee()方法中检查取消有什么意义呢?除了您可以找到的具体建议之外,例如How to: Cancel a PLINQ Query是你找的吗?
标签: c# .net-4.0 locking task-parallel-library async-await