繁体   English   中英

如何在MVC3中使用CancellationToken?

[英]How to use cancellationToken in MVC3?

我是MVC3的新手。 在我的项目MVC3中,我使用线程将Excel表格导入到数据库中,并且效果很好。 我对以下内容有疑问:1)如何使用CancellationToken停止线程? -在我的MVC#表格中,我有以下内容:2个分别名为“取消”和“导入”的按钮。 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;
    }

注意:如果我单击导入按钮,然后单击“在运行任务时”,然后单击“取消”按钮,将不会发生任何事情。。如何取消线程进程的执行。 请帮助我实现这一目标...

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

以下内容可能对您有用。

以下是高级步骤:

  • 在FinalImport方法中创建tokenSource。
  • 使用唯一键将令牌源添加到字典中,该键将保留请求。 (假设一个声明为静态,因此它对于整个应用程序是全局的)。
  • 将密钥传递回浏览器。

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

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

作为任务中的最后一件事情,您还应该从字典中删除令牌(否则令牌将不断积累,直到耗尽内存)。

如果由于某种原因,运行Web应用程序的进程失败并且IIS必须重新启动它,那么您将丢失字典。 IIS出于各种原因会重新启动您的进程,例如内存压力(例如,您可能会发生内存泄漏,并且它会创建一个新的要使用的进程),或者距上次重新启动它已有29个小时,或者因为有很多东西 如果您正在运行网络花园或网络农场,则不能保证每次请求都将您返回到同一进程,因此该词典可能不可用。

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

最后,我找到了解决方案。

1)需要将CancellationTokenSource初始化为静态。

2)需要在CancelToken方法中布置CancellationTokenSource对象令牌源
呼叫。

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();
    }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM