0

Active Directory からデータをフェッチして radGrid に表示するシナリオがありますが、データのコレクションは数百万単位と非常に大きいため、データを取得してグリッドに同期的に表示するには時間がかかりすぎます。そのため、パフォーマンスを向上させるために、2 つのタスク/スレッドの非同期呼び出しに取り組んでおり、1 つのタスクがデータの単位を読み取り、2 番目のタスク/スレッドがそれらのデータをグリッドに表示します。私の調査によると、これは Task Parallelism を使用して簡単に可能ですが、4.0 のこの機能に取り組んでいないため、複数のタスクが作成され、それらが同じデータで並列処理されてクエリを解決し、Task Parallelism を探索する例が必要です。 .

4

1 に答える 1

0

タスク並列ライブラリと async/await プログラミング モデルが適切な選択です。

次のようにします。

    async Task MainRoutine()
    {
        ConcurrentQueue<string> dataQueue = new ConcurrentQueue<string>();
        CancellationTokenSource cts = new CancellationTokenSource();
        Task tRead = ReadAsync(dataQueue);
        Task tWrite = InsertIntoGridAsync(dataQueue, cts.Token);

        await tRead;
        cts.Cancel();

        await tWrite;
        //Done
    }

    async Task ReadAsync(ConcurrentQueue<string> queue)
    {

        await Task.Run(() =>
        {
            while (!IsEndOfList)
            {
                string data = //Read data from database/active directory/ ...
                queue.Enqueue(data);
            }
        });
    }

    async Task InsertIntoGridAsync(ConcurrentQueue<string> queue, CancellationToken cancellationToken)
    {
        await Task.Run(async () =>
        {
            while (!cancellationToken.IsCancellationRequested)
            {
                string data;
                if (queue.TryDequeue(out data))
                {
                    //insert data to grid
                }
                else
                {
                    await Task.Delay(100);
                }
            }
        }, cancellationToken);
    }
于 2015-11-16T19:55:18.840 に答える