9

非同期/待機の方法でOracleデータベースにクエリを実行する一連のメソッドを記述したいと思います。ODP.NETは待機可能な*AsyncメソッドもBegin/EndOperationNameペアもサポートしていないようですが、これを手動で実装するにはどのようなオプションが必要ですか?

これまで見てきたI/Oを多用する非同期メソッドのすべての例は、.NETライブラリから他の非同期メソッドのみを呼び出しますが、コンテキスト切り替えが内部で行われる方法については明らかにされていません。ドキュメントによると、これらの場合、個別のスレッドは使用されず、マルチスレッドのオーバーヘッドはCPUを集中的に使用する操作にのみ価値があるようです。だから私はTask.Run()を使用することはオプションではないと思いますか、それとも私は間違っていますか?

4

3 に答える 3

1

私が知る限り、Oracle ODP は非同期ライブラリの同期ラッパーです。同じことを疑問に思っていたので、この投稿を見つけました:Oracle ODP呼び出しの非同期パターンの導入により、パフォーマンスが向上しますか? (IIS NET TCP で WCF を使用しています)。

しかし、前述のとおり、async パターンの導入が完了して新しい Task が作成され、呼び出し元のスレッドが既にスレッド プールから取得されている限り、改善はできず、単なるオーバーヘッドになります。

于 2016-01-15T10:54:46.560 に答える
-1

TaskCreationOptions.LongRunningTask.Factory.StartNewをいつでも使用できるため、.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();

        }
于 2013-01-05T12:45:43.007 に答える
-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);
    }
}

同期関数はすべて非同期にすることができ、それを待つことができます。

于 2014-09-15T11:44:55.277 に答える