此问题涉及另一个帖子中的评论:取消实体框架查询
为清楚起见,我将从那里重现代码示例:
var thread = new Thread((param) =>
{
var currentString = param as string;
if (currentString == null)
{
// TODO OMG exception
throw new Exception();
}
AdventureWorks2008R2Entities entities = null;
try // Don't use using because it can cause race condition
{
entities = new AdventureWorks2008R2Entities();
ObjectQuery<Person> query = entities.People
.Include("Password")
.Include("PersonPhone")
.Include("EmailAddress")
.Include("BusinessEntity")
.Include("BusinessEntityContact");
// Improves performance of readonly query where
// objects do not have to be tracked by context
// Edit: But it doesn't …Run Code Online (Sandbox Code Playgroud) 我创建了一个应用程序(Windows,WPF),它基本上是数据库(Sql Server)中数据的查看器.该应用程序没有编辑功能.
该应用程序提供了根据用户输入搜索记录的功能.在大多数情况下,行由键列搜索并运行得非常快.但是表中的一列是一个大文本字段,我希望能够根据该字段的内容搜索行.因此,生成的SQL查询可能需要一些时间才能完成.我想提供一个停止按钮,以便用户可以根据需要中止搜索.我在上面放置的链接使用Kill命令来杀死Sql server中的spid,但是我不确定这在我的情况下是如何工作的,因为我使用的是Entity Framework(4.1)
例如,假设有一个类似于此的查询:
var docs = from document in context.Documents
join header in context.Headers
on document.DocumentID equals header.HeaderID into headerGroup
from subdoc in headerGroup.DefaultIfEmpty()
where document.LargeTextColumn.Contains("search term")
select (...)
foreach (var item in docs)
{
//Do something with item here
}
Run Code Online (Sandbox Code Playgroud)
由于查询实际上没有发生,直到我使用foreach语句迭代它,如何为用户提供"停止查询"按钮?这类似于Sql Server Management Studio中的停止按钮.
这可能吗?
c# entity-framework cancel-button sql-server-2008 long-running-processes
我有一个调用其中一个方法的线程,现在这个方法执行一个查询,可能需要很长时间才能完成40分钟左右,
我想给用户一个选择,以便能够取消此操作(意味着停止线程并停止查询以释放数据库).
我应该提一下,我正在使用.net 4.5,SQL SERVER DB和C#开发WPF应用程序.
当我们的应用程序正在从数据库或 http 请求中读取一些数据并且用户点击取消按钮时,我希望能够立即取消从数据库或 http 请求中读取。这两个调用都不能立即取消,即使对于调用的异步版本也是如此。
如果我将代码设置为在下一个数据库/http 调用完成后立即结束任务怎么办?然后忘记那个任务并继续在我的应用程序中?我可以看到的一个缺点是如果在用户存在应用程序之前任务没有完成。
更新: JPVenson 为 http 和 ADO.NET 提供了一个很好的解决方案。但是,我们有时也会调用 Salesforce API,据我所知,它没有取消机制。所以这个问题仍然存在。
在取消时,我不需要返回的内容,因此从我的应用程序的角度来看,我可以忘记任务。这样做有什么缺点吗?