C# 如何立即停止正在运行的DbContext.SaveChanges()
我目前正在开发一项服务。服务关闭时间有限(4s) 我有一个关闭过程,这也会通过EF6将一些次要数据推送到sql数据库 关机 步骤1(停止正常操作) 步骤2将一些关机数据推送到数据库 第3步最终关闭,处理所有等 该应用程序有多个上下文和一个执行策略,该策略以重试一分钟的方式设置。我想保持这样 现在可能会发生数据库关闭的情况,因此对数据库的调用需要很长时间,由于执行策略的原因,最长需要1分钟 这是超过4s的方式,所以我想有一个选项,立即停止行动。我不能要求更多的时间 到目前为止,我已经尝试了SaveChangesSync(cancellationToken);但这仍然会继续执行一分钟,取消令牌不会起任何作用。然后,我尝试使用第二个任务调用上下文中的dispose、关闭连接等。这有时似乎有效,但在其他情况下,这仍然需要等待一分钟才能引发异常C# 如何立即停止正在运行的DbContext.SaveChanges(),c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我目前正在开发一项服务。服务关闭时间有限(4s) 我有一个关闭过程,这也会通过EF6将一些次要数据推送到sql数据库 关机 步骤1(停止正常操作) 步骤2将一些关机数据推送到数据库 第3步最终关闭,处理所有等 该应用程序有多个上下文和一个执行策略,该策略以重试一分钟的方式设置。我想保持这样 现在可能会发生数据库关闭的情况,因此对数据库的调用需要很长时间,由于执行策略的原因,最长需要1分钟 这是超过4s的方式,所以我想有一个选项,立即停止行动。我不能要求更多的时间 到目前为止,我已经尝试了Sav
var timeoutTask = Task.Run(() =>
{
while (true)
{
if (cancellationToken.IsCancellationRequested)
{
context.Database.Connection.Close();
Debug.WriteLine($"{DateTime.Now:G} {nameof(cancellationToken)} token is canceled!");
using(context) { }
return;
}
Task.Delay(10, timeoutTaskTokenSource.Token).Wait(timeoutTaskTokenSource.Token);
timeoutTaskTokenSource.Token.ThrowIfCancellationRequested();
}
}, cancellationToken);
现在我正在考虑创建一个线程并中止它,但是我希望我能找到一个更合理的解决方案
编辑:
在连接字符串中设置了连接超时:
Data Source=localhost;Initial Catalog=MyDb;Integrated Security=False;User ID=someuser;Password=somepassword;MultipleActiveResultSets=True;Connect Timeout=1;Application ame=somename;ConnectRetryCount=0;ConnectRetryInterval=1
命令超时也设置为1。如果数据库不可用,则可以使用连接字符串的属性。这将在延迟后中止连接尝试 如果要中止命令,可以使用该属性
context.Database.CommandTimeout = 5;
还有命令超时?实际的异常是什么?它来自什么延迟之后?两者都设置为1。例外情况是dbcontext无法访问数据库(提供程序无法打开)