【发布时间】:2014-12-30 01:32:00
【问题描述】:
我正在尝试对 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 64bit、Visual Studio Express 2013、Oracle Client 11g(32bit):OCI 11.2.0.01
【问题讨论】:
标签: c# oracle asynchronous odac