C# 需要深入了解任务并行性/示例,以便从数据库/active directory读取数据并在网格中显示它们

C# 需要深入了解任务并行性/示例,以便从数据库/active directory读取数据并在网格中显示它们,c#,multithreading,parallel-processing,task-parallel-library,task,C#,Multithreading,Parallel Processing,Task Parallel Library,Task,我有一个场景,我从active directory中获取数据并在radGrid中显示,但数据的收集量非常大,以百万计,因此检索数据并在网格中同步显示需要花费太多时间。 因此,为了提高性能,我们正在处理两个任务/线程的异步调用,其中一个任务读取一些数据单元,而第二个任务/线程在网格中显示这些数据。根据我的研究,使用任务并行很容易做到这一点,但由于我还没有研究过4.0的这一特性,我需要创建多个任务并在同一数据上并行工作的任何示例,以解决我的查询并进一步探索任务并行性。任务并行库和异步/等待编程模型是

我有一个场景,我从active directory中获取数据并在radGrid中显示,但数据的收集量非常大,以百万计,因此检索数据并在网格中同步显示需要花费太多时间。
因此,为了提高性能,我们正在处理两个任务/线程的异步调用,其中一个任务读取一些数据单元,而第二个任务/线程在网格中显示这些数据。根据我的研究,使用任务并行很容易做到这一点,但由于我还没有研究过4.0的这一特性,我需要创建多个任务并在同一数据上并行工作的任何示例,以解决我的查询并进一步探索任务并行性。

任务并行库和异步/等待编程模型是不错的选择为了你的案子

你可以这样做:

    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);
    }
async Task mainprotation()
{
ConcurrentQueue dataQueue=新ConcurrentQueue();
CancellationTokenSource cts=新的CancellationTokenSource();
Task-tRead=ReadAsync(数据队列);
Task tWrite=InsertIntoGridAsync(数据队列,cts.Token);
等待脚步;
cts.Cancel();
等着写;
//完成
}
异步任务ReadAsync(ConcurrentQueue队列)
{
等待任务。运行(()=>
{
而(!IsEndOfList)
{
字符串数据=//从数据库/active directory/读取数据。。。
排队(数据);
}
});
}
异步任务插入GridAsync(ConcurrentQueue队列,CancellationToken CancellationToken)
{
等待任务。运行(异步()=>
{
而(!cancellationToken.IsCancellationRequested)
{
字符串数据;
if(queue.TryDequeue(out数据))
{
//将数据插入网格
}
其他的
{
等待任务。延迟(100);
}
}
},取消令牌);
}

为什么需要显示数百万行数据?谁能读到这么多信息?您是否考虑过将数据划分为页面?请使用分页。显示用户百万行是没有意义的。是的,我在代码中使用了分页,不是一次显示所有数据,而是第一次检索数据的过程花费了两倍多的时间。所以我想通过使用并行编程任务来减少时间,其中一个任务从active directory获取一些记录,比如100条,另一个任务并行地在网格中显示这100条记录。