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

问题描述 投票:0回答:4

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

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

c# .net oracle task-parallel-library async-await
4个回答
1
投票

据我所知,Oracle ODP 是异步库的同步包装器。我发现这篇文章是因为我只是想知道同样的问题:将为 Oracle ODP 调用引入异步模式会提高性能吗? (我在 IIS NET TCP 上使用 WCF)。

但是,正如已经说过的,只要引入异步模式完成创建一个新的Task并且调用线程已经来自线程池,就没有什么改进是做不到的,而且只是一个开销.


0
投票

Oracle 现已发布新版本的 Oracle.ManagedDataAccess 驱动程序,支持异步等待编程模型。有关此版本中功能的更多信息,请查看Alex Keh 的博客


-1
投票

您始终可以将 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();

        }

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

任何同步函数都可以异步,并且您可以等待它。

© www.soinside.com 2019 - 2024. All rights reserved.