gpt4 book ai didi

c# - 如何立即停止正在运行的 DbContext.SaveChanges()

转载 作者:太空宇宙 更新时间:2023-11-03 14:42:04 24 4
gpt4 key购买 nike

我目前正在开发一项服务。服务关闭的时间有限(4 秒)。

我有一个关闭程序,这也会通过 EF6 将一些次要数据推送到 sql 数据库。

...

关机!

Step1(停止正常运行)

step2 将一些关机数据推送到数据库

step3 最后关机,处理所有等

该应用程序有多个上下文和一个以重试大约一分钟的方式设置的执行策略。我想保持这种状态。

现在可能会发生数据库已关闭 - 因此,由于执行策略,对数据库的调用需要很长时间,最多 1 分钟。

这已经超过 4 秒了,所以我希望可以选择立即停止操作。我不能要求更多的时间。

到目前为止,我已经尝试了 SaveChangesAsync(cancellationToken);但这仍然会继续执行一分钟,取消 token 不会执行任何操作。然后,我尝试使用第二个 Task 在上下文中调用 dispose,关闭连接等。这有时似乎可行,但在其他情况下,这仍然会等待一分钟才能引发异常。

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。

最佳答案

如果数据库不可用,您可以使用 Connection Timeout您的连接字符串的属性。这将在延迟后中止连接尝试。

如果你想中止一个命令,你可以使用 CommandTimeout属性(property)。

context.Database.CommandTimeout = 5;

关于c# - 如何立即停止正在运行的 DbContext.SaveChanges(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56337604/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com