0

我有一个场景,我从活动目录中获取数据并将其显示在 radGrid 中,但是数据的集合非常大,以百万计,因此检索它并在网格中同步显示它需要太多时间。因此,为了提高性能,我们正在处理两个任务/线程的异步调用,其中一个任务读取某个数据单元,第二个任务/线程在网格中显示这些数据。根据我的研究,这很容易使用 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 回答