问题描述
当我使用 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 (将#修改为@)