[英]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方法是单独的请求。 该应用程序将每个请求视为全新请求,就好像以前从未见过先前的请求一样。 您正在编写代码,就像它在有状态的环境中运行一样。
以下内容可能对您有用。
以下是高级步骤:
当用户在浏览器中按“取消”按钮时:
作为任务中的最后一件事情,您还应该从字典中删除令牌(否则令牌将不断积累,直到耗尽内存)。
如果由于某种原因,运行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.