簡體   English   中英

Oracle Client與基於任務的異步模式(異步/等待)

[英]Oracle Client vs. Task-based Asynchronous Pattern (async/await)

我想編寫一堆以異步/等待方式查詢Oracle數據庫的方法。 由於ODP.NET似乎既不支持等待的* Async方法也不支持Begin / EndOperationName對,因此我必須手動執行哪些選項?

到目前為止,我已經看到了所有I / O密集型異步方法的示例,它們僅調用.NET庫中的其他異步方法,但是在內部進行上下文切換的方式上絲毫不為過。 該文檔說,在這些情況下,不使用單獨的線程,並且多線程開銷顯然僅對CPU密集型操作有價值。 所以我想使用Task.Run()不是一個選擇,否則我錯了嗎?

只要我知道Oracle ODP是異步庫的同步包裝器即可。 我發現這個帖子的時候,我只是想知道一個問題:為Oracle ODP調用引入異步模式是否會提高性能? (我在IIS NET TCP上使用WCF)。

但是,正如已經說過的,只要完成了異步模式的創建,就創建了一個新Task,並且調用線程已經在線程池中,就無法進行任何改進,這只是開銷。

您始終可以將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);
    }
}

任何同步功能都可以設為異步,您可以等待它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM