从数据库/活动目录读取数据并在网格中显示的任务并行性示例

本文关键字:显示 网格 任务 并行性 活动 数据库 数据 读取 | 更新日期: 2023-09-27 18:08:37

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