加速发送给 Oracle 的取消信号

问题描述

当我使用 CancellationToken 方法取消我的任务时,它通常会被取消大约分钟。 30秒。时间取决于 Oracle 中查询的繁重程度,甚至可能需要 1 分钟。

任务在不同的线程上调用,使用 Task.Run(在获取数据的同时做一些 UI 加载动画)。

如果用户在运行时取消任务(关闭窗口)并在应用程序中启动一些新的 Oracle 任务,事情就会变得一团糟 - 突然很多打开的会话出现在 Oracle 中。我想通过加速取消信号来避免这种情况。

这是我的代码

    //global static variable,defined when window opens
    CancellationTokenSource cts= new  CancellationTokenSource(); 
    
    //CancellationToken get's cancelled when user leaves window
    private void OnCloseWindow(object target,ExecutedRoutedEventArgs e)
    {
         cts.Cancel(); 
    }
    
    public async Task<List<EmployeeModel>> Get_Employees(CancellationToken cts)
    {
      var data = new List<EmployeeModel>();
        
      try
      {
        using (OracleConnection con = new OracleConnection(conn_string))
        {
           con.OpenAsync(cts);
        
           OracleCommand cmd = new OacleCommand("Myschema.Procedure_1",con)
           {
             CommandType = CommandType.StoredProcedure
           };
           cmd.Parameters.Add("name_in",OracleDbType.Varchar2).Value = "John";
           cmd.Parameters.Add("surname_in",OracleDbType.Varchar2).Value = "Black";
                       
           using (cts.Register(() => cmd.Cancel()))
           {            
             using (OracleDataReader rdr = cmd.ExecuteReaderAsync(cts))
             {
               while (await rdr.ReadAsync(cts))
               {  
                 data.Add(new EmployeeModel()
                 {
                   NAME = rdr.Isdbnull(0) ? null : rdr.GetString(0),SURNAME = rdr.Isdbnull(1) ? null : rdr.GetString(1)
                 });
               }
             }
           }
         }
      }
      return data;
      }
      catch (OperationCanceledException)
      {
        return null;
      }
      catch (Exception)
      {
        return null;
      }
   }

我使用的是 OracleManagedDataAccess.dll,版本 4.122.19.1。我的解决方法是使用 Max pool size=3 的连接字符串设置。这 - 至少在测试期间 - 在 Oracle 中一次不会产生超过 3 个会话,但我不确定这是否是正确的方法

我还能做些什么来加快对 Oracle 的取消?某种我不知道的机制?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...