Oracle客户端与基于任务的异步模式(异步/等待)(Oracle Client vs. Task-

2019-07-17 18:43发布

我想写一堆的查询在异步/ AWAIT方式Oracle数据库的方法。 由于ODP.NET似乎既不支持awaitable *异步方法,也开始/ EndOperationName对,有什么可以怎么做手工实现这一点?

为I / O密集型异步方法,我见过的所有例子到目前为止调用从.NET库中唯一的其他异步方法,但没有光线洒在上下文切换在内部做的方式。 该文件说,在这些情况下,没有单独的线程中使用和多线程的开销仅适用于CPU密集型操作显然是值得的。 所以我想用Task.Run()是不是一种选择,还是我错了?

Answer 1:

只要我知道甲骨文ODP是异步库同步包装。 我发现这个职位,我只是想知道的一样:引进的Oracle ODP调用异步模式将提高性能? (我使用IIS NET TCP WCF)。

但是,因为它已经表示,只要引进了异步模式完成创建新任务,并且调用线程已经从线程池,没有改善无法做到的,这将只是一个开销。



Answer 2:

你可以随时使用Task.Factory.StartNewTaskCreationOptions.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();

        }


Answer 3:

我用这

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);
    }
}

任何同步功能可以由异步的,你可以等待它。



文章来源: Oracle Client vs. Task-based Asynchronous Pattern (async/await)