cancellation
取消架构
.NET4.5包含一个取消架构,允许以标准方式取消长时间运行的任务。每个阻塞调用都应支持这种机制。当然目前不是所有的阻塞都实现了这种新的技术,但越来越多的阻塞调用都支持它。已提供了这种机制的技术有任务,并发集合类,并行LINQ和几种同步机制。
取消架构基于协作行为,它不是强制的。长时间运行的任务会检查它是否被取消,并返回控制权。
支持取消的方法接受一个cancellationToken参数。这个类定义了IsCancellationrequestd属性,其中长时间运行的操作可以检查它是否应终止。
1.1parallel.For()方法的取消
var cts = new CancellationTokenSource();
cts.Token.Register(() => console.WriteLine("*** token canceled"));
cts.CancelAfter(500);
try
{
ParallelLoopResult result = Parallel.For(0, 100, new ParallelOptions()
{
CancellationToken = cts.Token,
}, x =>
{
Console.WriteLine(" loop {0} started", x);
int sum = 0;
for (int i = 0; i < 100; i++)
{
Thread.Sleep(20);
sum += i;
}
Console.WriteLine("loop {0} finished", x);
});
}
catch (OperationCanceledException ex)
{
Console.WriteLine(ex.message);
}
运行应用程序,会得到如下结果,第0,25,50,75,1迭代启动,在一个有4个内核cpu上系统运行。通过取消此操作,其他所有的迭代操作都在启动之前取消了。启动的迭代操作允许完成,因为取消操作总是以协作方式进行,以避免在取消迭代操作的中间泄露资源。
2.任务取消
同样的取消模式也适用于任务。首先,新建一个CancellationTokenSource、如果仅需要一个取消标记,就可以访问Task.Factory.CancellationToken以使用默认的取消标记。
private static void TRaskCancell()
{
var cts = new CancellationTokenSource();
cts.Token.Register(() => Console.WriteLine("*** token canceled"));
cts.CancelAfter(500);
Task t1 = Task.Run(() => {
Console.WriteLine("in task");
for (int i = 0; i < 20; i++)
{
Thread.Sleep(100);
CancellationToken token = cts.Token;
if (token.IsCancellationRequested)
{
Console.WriteLine("cancelling was requested"+"cancelling from within the task");
token.throwIfCancellationRequested();
break;
}
Console.WriteLine("in loop ");
}
Console.WriteLine("task finished without cancelation");
},cts.Token);
try
{
t1.Wait();
}
catch (AggregateException ex)
{
Console.WriteLine("exception:{0},{1}",ex.GetType().Name,ex.Message);
foreach (var item in ex.InnerExceptions)
{
Console.WriteLine("inner excetion:{0},{1}",ex.InnerException.GetType().Name,ex.InnerException.Message);
}
}
}
运行应用程序,可以看到任务启动了,运行了几个循环,并获得了取消请求。之后取消任务,并抛出TaskCanceledException异常,它是从方法调用ThrowIfCancellationRequested()中启动。调用等待任务时,会捕获AggregateException异常,它还包含内部异常TaskCanceledException。
相关阅读
<script type="text/javascript"> document.oncontextmenu=function(){return false}; </script>
1. Delete,按一下就取消一个点。2. Backspace,按一下就取消一个点。3. Ctrl+Z,撤销上一步操作(慎选,算好要撤销哪些步骤)。4. 历史记录
Excel中加了密码的表格需要进行解密操作,解密具体该如何进行操作呢?下面是由seo实验室小编分享的excel表格取消密码保护的教程,以供
很多EXCEL档不想让别人随意看会加密,有时这个文档不再有机密了,每次输密码很麻烦,想取消密码,如何操作呢?下面小编来告诉你取消EXCEL2
百度的阿拉丁平台主要用于百度内部为用户提供结构化的搜索结果,完善用户体验,而此次则正式宣布要对站长们进行全面开放,允许接入各大