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

本文关键字:异步 async await 模式 任务 客户端 于任务 Oracle | 更新日期: 2023-09-27 17:50:35

我想写一堆方法查询Oracle数据库在异步/等待的方式。因为ODP。. NET似乎既不支持可等待的*异步方法也不支持Begin/EndOperationName对,我必须手动实现这个选项是什么?

到目前为止,我看到的所有I/o密集型异步方法的示例都只调用。net库中的其他异步方法,但没有说明上下文切换在内部完成的方式。文档说,在这些情况下,不使用单独的线程,多线程开销显然只值得cpu密集型操作。所以我想使用Task.Run()不是一个选项,还是我错了?

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

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

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

您总是可以使用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();
        }

我用这个

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

任何同步函数都可以被设置为异步,并且可以等待。