Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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# 使用Oracle.DataAccess(ODAC)在C中进行异步调用_C#_Oracle_Asynchronous_Odac - Fatal编程技术网

C# 使用Oracle.DataAccess(ODAC)在C中进行异步调用

C# 使用Oracle.DataAccess(ODAC)在C中进行异步调用,c#,oracle,asynchronous,odac,C#,Oracle,Asynchronous,Odac,我试图对Oracle进行异步调用,但它是同步执行的。请看下面的代码,告诉我我做错了什么 我已经安装了ODAC ODTwithODAC1120320_32bit.zip,并使用Oracle.DataAccess.dll程序集调用Oracle。在此之前,我使用了不推荐使用的System.Data.OracleClient,并获得了相同的结果 using System; ... using System.Threading; using System.Threading.Tasks; using Or

我试图对Oracle进行异步调用,但它是同步执行的。请看下面的代码,告诉我我做错了什么

我已经安装了ODAC ODTwithODAC1120320_32bit.zip,并使用Oracle.DataAccess.dll程序集调用Oracle。在此之前,我使用了不推荐使用的System.Data.OracleClient,并获得了相同的结果

using System;
...
using System.Threading;
using System.Threading.Tasks;
using Oracle.DataAccess.Client;

namespace OracleTest
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    async private void button1_Click(object sender, EventArgs e)
    {
      OracleConnection connection = new OracleConnection("User Id=myuser;Password=mypwd;Data Source=mydb");
      connection.Open();  

      OracleCommand command = new OracleCommand("select count(col) from bigtable", connection);

      Task<Object> result = command.ExecuteScalarAsync();
      label1.Text = "BEFORE" + DateTime.Now.ToLocalTime() + " - ";
      label1.Text += await result;
      label1.Text += " - AFTER " + DateTime.Now.ToLocalTime();

      connection.Close(); 
      connection.Dispose(); 
    }
  }
}
dbms需要几分钟才能获得计数。我所期望的是:ExecuteScalarAsync被调用,它给Oracle一个调用。在将BEFORE时间写入label1之后。然后我等待Oracle查询完成并获取其结果。然后将AFTER时间写入label1。所以前后应该有所不同。但是,它们始终是相同的时间,即查询返回其结果的时间。为什么呢

我也试过了

  CancellationToken cancellationToken = new CancellationToken();
  Task<Object> result = command.ExecuteScalarAsync(cancellationToken);
这并没有改变任何事情。这到底有什么用?我不会简单地调用command.Cancel;而不是使用CancellationToken

我的系统:Windows 8 Pro 64位,Visual Studio Express 2013,Oracle客户端11g 32位:OCI 11.2.0.01

如果您明确指出它实现了ExecuteScalar的异步版本,但同步返回任务,阻止了调用线程。。因此,它似乎正在执行它所说的阻止调用线程的操作

要利用ExecuteScalarAsync,您需要执行以下操作

using (object obj = await command.ExecuteScalarAsync())
{
   //....
}

祝你好运。

据我所知,Oracle的提供商仍然没有实现异步方法。这是被问到的,我在Oracle的OTN或论坛上找不到任何更新的内容


正如前一个问题的答案所说,异步方法的默认实现是调用同步对应项,而不是将它们打包在任务中运行,这实际上可能会导致性能下降。

这并不能解释也不能解决问题。任务的创建是同步的,命令的执行不应该是同步的。使用包装wait调用应该没有效果,甚至可能不会编译对象,因为它没有实现IDisposable。问题似乎是提供者实际上是同步执行调用的,不管文档怎么说。@Bob Jarvis:谢谢你的帮助。这就意味着ExecuteScalarAsync与ExecuteScalar的功能相同;它同步工作。它阻塞线程,直到它完成为止,就像任何其他同步命令一样。他们或多或少地说:我们实现了这个功能,因为继承迫使我们这么做,但我们只是实现了错误的功能。是这样吗?顺便问一下:在这里使用有什么好处?我没有看到。而且它甚至没有编译错误:必须隐式转换为IDisposable。@Panagiotis Kanavos:啊,谢谢你的评论。因此,我似乎正确地理解了这一点,并且函数的编写并不是为了异步工作。请注意,这个答案是指不推荐使用的System.Data.Oracle提供程序,而不是ODAC。关于ODAC的文档可以在Oracle的网站上找到,而不是MSDN。为了执行命令,可能需要特定的连接字符串参数asynchronously@PanagiotisKanavosODAC甚至没有Execute…Async方法,所以我不知道OP的代码是如何编译的,除非他仍然在使用System.Data。非常感谢。我没有看到另一条线;也许是因为我只是在找ExecuteScalarAsync。是的,这就解释了。遗憾的是,甲骨文只是不写这些功能:-