Dav*_*len 5 .net task cancellationtokensource
当我们的应用程序正在从数据库或 http 请求中读取一些数据并且用户点击取消按钮时,我希望能够立即取消从数据库或 http 请求中读取。这两个调用都不能立即取消,即使对于调用的异步版本也是如此。
如果我将代码设置为在下一个数据库/http 调用完成后立即结束任务怎么办?然后忘记那个任务并继续在我的应用程序中?我可以看到的一个缺点是如果在用户存在应用程序之前任务没有完成。
更新: JPVenson 为 http 和 ADO.NET 提供了一个很好的解决方案。但是,我们有时也会调用 Salesforce API,据我所知,它没有取消机制。所以这个问题仍然存在。
在取消时,我不需要返回的内容,因此从我的应用程序的角度来看,我可以忘记任务。这样做有什么缺点吗?
你会如何“杀死”一个任务?AFAIK 你只能“杀死”线程,但不能“杀死”任务,因为它们没有这样的机制。
使用标准 TaskScheduler 时,任务将作为ThreadPoolItem排队,并且在停止应用程序的情况下,所有这些 ThreadPool 线程将被终止,包括所有重新等待/仍在运行的任务。
对于标题:这确实取决于任务的类型,但总的来说,您总是希望至少出于日志记录的目的观察任何任务的结果。如果您不观察并处理任务引发的潜在异常,则您的应用程序将面临“损坏状态”的风险,其中任务可能会以您之前没有预料到的方式崩溃,从而更改应用程序中的数据,而这些数据不会发生。合理。
所以,是的,强烈建议您处理所有任务,至少是记录和错误纠正/观察。
对于取消 HTTP 调用:WebClient:如何取消长时间运行的 HTTP 请求?
对于取消 SQL 命令:这是另一种情况,很大程度上取决于您使用的 ORM - EF取消实体框架查询 - Ado.Net https://learn.microsoft.com/en-us/dotnet/api/ system.data.sqlclient.sqlcommand.cancel?view=netframework-4.8