gpt4 book ai didi

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

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

我正在尝试对 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 Client 11g(32 位):OCI 11.2.0.01

最佳答案

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

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

关于c# - 使用 Oracle.DataAccess (ODAC) 在 C# 中进行异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26713473/

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