2012-03-27 66 views
0

我有一个执行功能的异步任务。该函数不包含任何循环语句,而是在sql server上执行一系列sql命令。现在,我的窗口上有一个可以取消这些sql操作的按钮。换句话说,取消整个异步任务。如何取消没有执行任何基于循环的语句的任务

我知道这项技术需要CancellationTokenSource和CancellationToken取消任务,但我在互联网上看到很多例子,并且他们都显示任务正在执行的函数包含循环语句,他们正在检查它们为IsCancellationRequested布尔属性。但就我而言,情况并非如此。我的函数没有任何循环语句,我可以检查这个布尔属性。

请提出任何方法/技巧。

任何帮助将是非常可观......

Thanx提前...

+0

如果您取消完成的命令时这些命令不在事务中,我相信它们将不会回滚。为什么用户会取消?如果这是一个长时间运行的任务,请考虑使用Progress的BackGroundWorker,以便可以报告已处理了多少个sql语句。 – Paparazzi 2012-03-27 14:27:49

+0

@Blam,也许这些都是'SELECT',所以将它们回滚并不重要? – svick 2012-03-27 16:18:47

回答

1

嗯,有真的只有三个基本程序流:序列(步骤1,步骤2等),选择(if-type语句)和迭代(循环)。

如果你没有任何循环,你只剩下选择和顺序。这意味着你的代码很可能将最终看起来像(伪代码,很明显):

perform sql (statement1) 
if IsCancellationRequested: return 

perform sql (statement2) 
if IsCancellationRequested: return 
: 
: 
perform sql (statementN) 
if IsCancellationRequested: return 

换句话说,没有循环,有把支票在那里它会被称为很多没有单一方便的地方次,你必须自己多次打电话。根据调用的次数,在循环中调用它并没有真正的区别。


如果你的问题是,你不喜欢在你的源代码中穿插许多检查的想法,你可以创建一个函数来为你做,是这样的:

def execSql (sqlStatement): 
    perform sql (sqlStatement) 
    return IsCancellationRequested 

那么你的线条变得:

if (perform sql (statement1)): return 
if (perform sql (statement2)): return 
: 
if (perform sql (statementN)): return 

现在,你也许可以通过把语句转换成某种形式的集合,这样一来,你会添加循环只需要编写一个支票/退货。但这意味着你现在做事情的方式会发生更大的变化。

0

你应该在你的代码中检查它。你的例子(你看到的例子),因此它检查每次迭代的取消。既然你不需要,你将不得不手动选择当你想检查用户是否取消它。既然你有查询,也许在每个查询之后,或每2或3个查询。当你需要它时。

+0

@gbianchi ...看到的东西是,用户可以通过点击按钮在ANYTIME取消任务。所以保持每行后的检查,我认为这是一个荒谬的想法... – Uday0119 2012-03-27 14:18:33

+0

那么..施工检查后,每一行;)但你只写了一次:) – gbianchi 2012-03-27 14:19:54

0

所以让他们!

简单的例子(如你喜欢,你可以扩展它):

List<string> _sqls = new List<string>(); 
_sqls.Add("Select ... "); 
_sqls.Add("Update ... "); 
_sqls.Add("Select ... "); 

foreach (var sql in _sqls) 
{ 
    Execute(sql); 
    if (IsCancellationRequested) 
    { 
     // Make some rollback 
     return; 
    } 
} 

为了更好的体验,你可以使用List<Func<..>>List<Action<..>>代替List<string>甚至拿出查询,生成器,工厂方法设计模式。