gpt4 book ai didi

c# - Parallel.ForEach 和 DataGridViewRow

转载 作者:行者123 更新时间:2023-12-04 14:55:50 26 4
gpt4 key购买 nike

我在将 .AsParallel 转换为 Parallel.ForEach 时遇到问题。我有一个 DataGridView,然后我将一些值放在它的第一列中,然后使用 ForEach 循环将值发送到方法,然后获取返回值我将返回值放到第二列。

一开始;我正在使用 ForEach 循环,但它需要太多时间,然后我决定使用 .AsParallel 但我认为,在我的情况下,使用 可能更好Parallel.ForEach 但我无法让它与 datagridviewrow 一起工作。

ForEach 方法:

 foreach (DataGridViewRow dgvRow in dataGrid1.Rows)
{
// SOME CODES REMOVED FOR CLARITY
string data1 = row.Cells[1].Value;
var returnData = getHtml(data1);
row.Cells[2].Value = returnData;
}

AsParallel 方法:

dataGrid1.Rows.Cast<DataGridViewRow>().AsParallel().ForAll(row =>
{
// SOME CODES REMOVED FOR CLARITY
string data1 = row.Cells[1].Value;
var returnData = getHtml(data1);
row.Cells[2].Value = returnData;
});

那么,我如何将 Parallel.ForEach 循环与 DataGridViewRow (DataGridView) 一起使用?

谢谢。

最佳答案

如果 getHtml(以及循环的其他非 UI 部分)相对昂贵,那么并行执行您尝试执行的操作是有意义的,如果它很便宜,那么它会并行执行它没有意义,因为无论如何更新 UI(您的数据网格)都需要按顺序进行,因为只有 UI 线程才能更新它。

如果 getHtml(以及循环的其他非 UI 部分)相对昂贵,您可以执行以下操作:

var current_synchronization_context = TaskScheduler.FromCurrentSynchronizationContext();

Task.Factory.StartNew(() => //This is important to make sure that the UI thread can return immediately and then be able to process UI update requests
{
Parallel.ForEach(dataGrid1.Rows.Cast<DataGridViewRow>(), row =>
{
// SOME CODES REMOVED FOR CLARITY
string data1 = row.Cells[1].Value;
var returnData = getHtml(data1); //expensive call

Task.Factory.StartNew(() => row.Cells[2].Value = returnData,
CancellationToken.None,
TaskCreationOptions.None,
current_synchronization_context); //This will request a UI update on the UI thread and return immediately
});
});

创建 Task 并使用 TaskScheduler.FromCurrentSynchronizationContext() 将在 Windows 窗体应用程序和 WPF 应用程序中工作。

如果您不想为每个 UI 更新安排一个任务,您可以像这样直接调用 BeginInvoke 方法(如果这是一个 Windows 窗体应用程序):

dataGrid1.BeginInvoke((Action)(() =>
{
row.Cells[2].Value = returnData;
}));

我上面的建议会导致数据在处理/生成时呈现给 UI。

如果您不关心这个,并且您可以先处理所有数据然后更新 UI,那么您可以执行以下操作:

1) 在UI线程中收集来自UI的所有数据

2) 通过 Parallel.ForEach 处理数据并将结果存储在数组中

3) 从UI线程渲染数据到UI

关于c# - Parallel.ForEach 和 DataGridViewRow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32876975/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com