Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 停止执行_C#_Datacontext - Fatal编程技术网

C# 停止执行

C# 停止执行,c#,datacontext,C#,Datacontext,我有一个DataContext,在其中运行.ExecuteQuery以返回一些结果 我想在一段时间后,或者当用户停止查询时,完全停止查询,但我不知道怎么做 我试着在这方面做一些研究,但没有结果 using(SomeDataContext db = new SomeDataContext) { db.CommandTimeout = 10; // Test purposes List<Something> sme = new List<Something>

我有一个
DataContext
,在其中运行
.ExecuteQuery
以返回一些结果

我想在一段时间后,或者当用户停止查询时,完全停止查询,但我不知道怎么做

我试着在这方面做一些研究,但没有结果

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();
}
使用(SomeDataContext db=new SomeDataContext)
{
db.CommandTimeout=10;//测试目的
列表sme=新列表;
//我想取消这个
sme=db.ExecuteQuery(“可能需要一些时间的存储过程”).ToList();
}

我认为您可以通过应用逻辑来实现此功能

逻辑:

当您启动执行任务时,在此之前使用事务,并在成功完成执行后提交事务

同时,如果您想停止执行该过程回滚事务并关闭连接

风险:您必须确保并测试它能够很好地维护事务和连接,否则您的数据库可能会陷入*DeadLock*

参考下面的示例代码和

在类范围内声明

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

这是两个不同的问题:

  • 要在设定的时间后停止查询的执行,可以使用连接超时。根据您的数据库,您可以有一个数据库查询的最大运行时间

  • 对于用户来说,停止执行有点困难。您必须执行查询async以将controll返回给用户,但要维护对连接的引用,然后允许用户关闭连接。根据您的数据库,数据库应该注册没有人在等待回复,然后停止执行


最简单的方法是为EnityFramework放弃LinqToSQL中的所有内容(这是一种已损坏且不受支持的技术)。然后您可以只使用
DbContext.Database.ExecuteSqlCommandAsync(String,CancellationToken,Object[])
您可以使用取消令牌..嗯..取消查询。注意。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();
}

我不认为回顾这件事会对我所做的事情产生积极的影响为什么?如果停止执行,我认为,到目前为止应用的任何更改都需要回滚。请参阅。。我已经编辑了答案。。现在你可能明白了。我真的很喜欢这种方法
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();
}