Oracle客户端与基于任务的异步模式(异步/等待)

时间:2013-01-03 10:04:26

标签: c# .net oracle task-parallel-library async-await

我想编写一系列以异步/等待方式查询Oracle数据库的方法。由于ODP.NET似乎既不支持等待的* Async方法也不支持Begin / EndOperationName对,我有哪些选项可以手动实现?

到目前为止,我所看到的I / O密集型异步方法的所有示例都只调用.NET库中的其他异步方法,但是内部完成上下文切换的方式没有任何亮点。文档说在这些情况下没有使用单独的线程,并且多线程开销显然仅适用于CPU密集型操作。所以我猜使用Task.Run()不是一个选项,或者我错了吗?

3 个答案:

答案 0 :(得分:1)

只要我知道Oracle ODP是异步库的同步包装器。我发现这篇文章只是想知道:Oracle ODP调用的异步模式是否会提高性能? (我在IIS NET TCP上使用WCF)。

但是,正如已经说过的那样,只要异步模式的引入完成创建一个新的Task并且调用线程已经来自线程池,就不能做任何改进,而且它只是开销。

答案 1 :(得分:-1)

你总是可以使用 Task.Factory.StartNew TaskCreationOptions.LongRunning ,这样.NET就会创建一个新线程,而不是使用线程池线程。以下是您可以应用于您的操作的手动异步代码。

private static void ManualAsyncOperation()
        {

            Task<string> task = Task.Factory.StartNew(() =>
                {
                    Console.WriteLine("Accessing database .....");
                    //Mimic the DB operation 
                    Thread.Sleep(1000);

                    return "Hello wolrd";
                },TaskCreationOptions.LongRunning);

            var awaiter =task.GetAwaiter();
            awaiter.OnCompleted(() =>
                {
                    try
                    {
                        var result = awaiter.GetResult();

                        Console.WriteLine("Result: {0}", result);
                    }
                    catch (Exception exception)
                    {

                        Console.WriteLine("Exception: {0}",exception);
                    }
                });
            Console.WriteLine("Continuing on the main thread and waiting for the result ....");
            Console.WriteLine();

            Console.ReadLine();

        }

答案 2 :(得分:-1)

我正在使用此

public static class TaskHelper
{
    public async static Task<T> AsAsync<T>(Func<T> function, TaskCreationOptions taskCreationOptions = TaskCreationOptions.None)
    {
        return await Task.Factory.StartNew(function, taskCreationOptions);
    }

    public async static Task AsAsync(Action action, TaskCreationOptions taskCreationOptions = TaskCreationOptions.None)
    {
        await Task.Factory.StartNew(action, taskCreationOptions);
    }
}

任何同步函数都可以异步,你可以等待它。