Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# 如何立即停止正在运行的DbContext.SaveChanges()_C#_Entity Framework_Entity Framework 6 - Fatal编程技术网

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

C# 如何立即停止正在运行的DbContext.SaveChanges(),c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我目前正在开发一项服务。服务关闭时间有限(4s) 我有一个关闭过程,这也会通过EF6将一些次要数据推送到sql数据库 关机 步骤1(停止正常操作) 步骤2将一些关机数据推送到数据库 第3步最终关闭,处理所有等 该应用程序有多个上下文和一个执行策略,该策略以重试一分钟的方式设置。我想保持这样 现在可能会发生数据库关闭的情况,因此对数据库的调用需要很长时间,由于执行策略的原因,最长需要1分钟 这是超过4s的方式,所以我想有一个选项,立即停止行动。我不能要求更多的时间 到目前为止,我已经尝试了Sav

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

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

关机

步骤1(停止正常操作)

步骤2将一些关机数据推送到数据库

第3步最终关闭,处理所有等

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

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

这是超过4s的方式,所以我想有一个选项,立即停止行动。我不能要求更多的时间

到目前为止,我已经尝试了SaveChangesSync(cancellationToken);但这仍然会继续执行一分钟,取消令牌不会起任何作用。然后,我尝试使用第二个任务调用上下文中的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。

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

如果要中止命令,可以使用该属性

context.Database.CommandTimeout = 5;

还有命令超时?实际的异常是什么?它来自什么延迟之后?两者都设置为1。例外情况是dbcontext无法访问数据库(提供程序无法打开)