如何:取消Web服务功能请求

时间:2011-08-24 21:26:36

标签: c# asp.net web-services jquery

这可能会在别处讨论,但我找不到。我有一个.Net Web服务,它具有循环日期范围的函数,并在数据库中运行计算和更新记录。如果您将此功能赋予较长的日期范围,则可能需要相当长的时间才能完成。在这种情况下,我需要一种方法来阻止这个功能。

是否有一种方法可以在已识别的线程中运行Web服务函数调用,以便在需要时可以取消该线程?或者我是在思考这个?我正在使用带有jQuery的C#.Net Web页面来执行对Web服务功能的AJAX调用。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

为您的Web服务添加一个Cancel()方法,用于设置状态变量。然后,只需让你的长时间运行操作定期检查这个变量并停止它的设置(当然有适当的保护)。

答案 1 :(得分:1)

您需要网络服务方法:

  1. StartCalculation(parms),它会跨越长时间运行的操作并返回ID
  2. 取消计算(ID),通过终止长时间运行来取消计算。
  3. “长时间运行”的实施取决于您的服务主机(IIS,Windows服务等)。

答案 2 :(得分:0)

当然,你可以做到。如果您使用的是.NET 4,则可以轻松取消任务:

 CancellationTokenSource cts = new CancellationTokenSource();
 var processingTask = Task.Factory.StartNew(() =>
    {
          foreach(var item in StuffToProcess())
          {
               cts.Token.ThrowIfCancellationRequested();

               // Do your processing in a loop
          }
    });

  var cancelTask = Task.Factory.StartNew(() =>
      {
           Thread.Sleep(/* The time you want to allow before cancelling your processing */);
           cts.Cancel();
      });

   try
   {
       Task.WaitAll(processingTask, cancelTask);
   }
   catch(AggregateException ae)
   {
       ae.Flatten().Handle(x =>
          {
               if(x is OperationCanceledException)
               {
                   // Do Anything you need to do when the task was canceled.
                   return true;
               }

               // return false on any unhandled exceptions, true for handled ones
          });
   }