如何在mvc中使用cancellationToken

本文关键字:cancellationToken mvc | 更新日期: 2023-09-27 18:11:53

我是MVC3新手。在我的项目MVC3,我使用线程导入excel表到数据库,它工作完美。我对以下几点有疑问,1)如何使用CancellationToken停止线程??-在我的MVC#形式我有以下…两个按钮分别命名为"取消"answers"导入"分别。2)在导入按钮提交事件上,我有以下代码:

    //Button Click on Import
    [HttpPost]
    public ActionResult FinalImport(FormCollection collection)
      {
            Task.Factory.StartNew(() =>
            { 
               //My Coding To Import
            } , tokenSource.Token);
            return null;
      }
    CancellationTokenSource tokenSource=new CancellationTokenSource();
    //Button Click on Cancel 
    public void CancelToken()
    {
        tokenSource.Token.ThrowIfCancellationRequested();
        tokenSource.Cancel();
      //  return null;
    }

注意:如果我点击import按钮和While running the task,然后点击Cancel按钮,什么都不会发生。如何取消线程进程的执行。请帮助我实现这个目标……

如何在mvc中使用cancellationToken

因为web本质上是一个无状态的环境,所以您需要某种方法将取消令牌从一个请求持久化到另一个请求。FinalImport和CancelToken方法是单独的请求。应用程序将每个请求都视为全新的,就好像以前从未见过之前的请求一样。您正在编写代码,就好像它在有状态环境中运行。

下面的代码可以为你工作。

以下是高级步骤:

  • 在FinalImport方法中创建tokenSource
  • 将令牌源添加到具有唯一键的字典中,该键将持久化请求。(比如一个声明为静态的,这样它对整个应用程序是全局的)。
  • 将密钥返回给浏览器。

当用户在浏览器中按下取消按钮时:

  • 让浏览器在请求中发送密钥
  • 在你的CancelToken中,用浏览器随请求发送的键查找字典。
  • 使用字典中的tokenSource取消任务。
  • 从字典中删除token。

作为任务中的最后一件事,您还应该从字典中删除标记(否则它们会不断增加,直到内存耗尽)

如果,由于任何原因,运行你的web应用程序的进程应该失败,IIS必须重新启动它,那么你将失去你的字典。IIS会因为各种原因重新启动你的进程,比如内存压力(例如,如果你发现你可能有内存泄漏,它会创建一个新的进程来处理),或者因为它距离上次重新启动它已经29个小时了,或者因为任何其他原因。如果你正在运行一个网络花园或网络农场,那么你不能保证每次请求都返回到相同的进程,所以字典可能不可用。

虽然我意识到这不是一个代码解决方案,但我希望这有助于更好地理解问题域。

我终于找到解决办法了。

1)需要初始化CancellationTokenSource为静态

2)需要在CancelToken方法中处理CancellationTokenSource对象tokensource
电话。

public static CancellationTokenSource tokenSource; 
[HttpPost]
    public ActionResult FinalImport(FormCollection collection)
      {
            tokensource=new CancellationTokenSource();
            Task.Factory.StartNew(() =>
            { 
                 if (ts.IsCancellationRequested)
                            {
                                break;
                            }
               //My Coding To Import
            } , tokenSource.Token);
            return null;
      }

    //Button Click on Cancel 
    public void CancelToken()
    {
        tokenSource.Cancel();
        tokensource.Dispose();
    }

就是这样. .编码…!快乐!

相关文章:
  • 没有找到相关文章