我有一个运行.ExecuteQuery来返回一些结果的DataContext。
我想在一段时间后完全停止查询,或者当用户停止查询时,但我不知道如何做到这一点。
我试着在这方面做了一些研究,但没有结果。
using(SomeDataContext db = new SomeDataContext)
{
db.CommandTimeout = 10; // Test purposes
List<Something> sme = new List<Something>;
// I want to be able to cancel this
sme = db.ExecuteQuery<Something>("Stored Procedure that may take some time").ToList();
}发布于 2014-03-28 15:35:28
要做到这一点,最简单的方法是为EnityFramework废弃LinqToSQL中的所有东西(这是一项支离破碎且不受支持的技术)。然后,您可以只使用DbContext.Database.ExecuteSqlCommandAsync(String, CancellationToken, Object[]),您可以使用取消令牌来..well...cancel查询。请注意。LinqToSQL不支持取消。
但是,您也可以直接使用ADO.Net DbCommand来完成此操作。这很简单。
public Task RunCommand(CancelationToken cancel)
{
using(var connection = new DbConnection())
{
connection.Open();
using(var command = connection.CreateCommand())
{
//setup the command
await command.ExecuteNonQueryAsync(cancel.Token);
}
}
}
public void Main()
{
var cancel = new CancellationTokenSource();
RunCommand(cancel.Token);
cancel.Cancel();
}发布于 2014-03-28 15:05:09
这是两个不同的问题:
发布于 2014-03-28 14:31:04
我认为您可以通过应用逻辑来实现此功能。
逻辑:
当您启动ExecuteQuery时,在此之前使用 Transaction ,并在成功完成execution Commit事务之后。
同时,如果您想停止执行该过程。Rollback transaction和Close the Connection。
*DeadLock__.*风险:您必须确保并测试它能够很好地维护事务和连接,否则您的数据库就会进入
请参阅下面的示例代码和http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx
System.Data.Common.DbTransaction trans = null;在类范围内声明。
//dbAdmin is my DataContext
dbAdmin.Connection.Open();
trans = dbAdmin.Connection.BeginTransaction();
dbAdmin.Transaction = trans;
try
{
//Perform ExecuteQuery
trans.Commit();
}
catch(Exception)
{
// Rollback transaction
if (trans != null)
trans.Rollback();
return "Some error occured while saving record. Transaction has being rollbacked.";
}以及在停止执行事件中,
if (trans != null)
trans.Rollback();https://stackoverflow.com/questions/22705573
复制相似问题