- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在将 .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/
我有一个 DataGridView,其中包含三个不同的 DataColumns 的未绑定(bind)数据。行可以按每一列排序,但除此之外不允许对显示的数据进行任何操作。 当我查询 SelectedRo
我正在使用以下代码将一堆 DataGridViewRow 元素设置为不可见。我使用的规则是检查关联数据源的 bool 标志。如果标志为真,将显示该行。否则,它将不可见。 以下代码有效;然而,这样做会花
我想将 DataGridviewRow 作为 ref 传递给它的单元格,但我无法这样做 foreach(DataGridViewRow dgr in dgvMarksEntryByClassWise.
我正在尝试遍历 DataGridView 中的两列并将它们添加到如下坐标中 foreach (DataGridView row in dataGridView1.Rows) { double
我遇到了一个有趣的问题。当我只将一个 DataGridViewRow 添加到 DataGridView 时,一切都按预期工作:DataGridView.Rows[0] 是添加的行。当我以某种方式添加第
在 Windows 窗体中,我试图通过向其插入 DataGridViewRows 来手动填充 DataGridView,因此我的代码如下所示: DataGridViewRow row = new Da
我是 C# 新手,对“var”的使用有疑问 当我使用下面的代码时一切正常 foreach(DataGridViewRow row in myGrid.Rows) { if (row.Cells
我在 Windows 窗体应用程序(用 C# 编写)上有一个 DataGridView 控件。 我需要的是:当用户选择一个 DataGridViewRow,然后单击“删除”按钮时,应该删除该行并且接下
这有效: DataGridView.Rows.Add("Bla Bla Bla", value1, value2) 但如果我这样做: Dim newrow As New DataGridViewRow
我在将 .AsParallel 转换为 Parallel.ForEach 时遇到问题。我有一个 DataGridView,然后我将一些值放在它的第一列中,然后使用 ForEach 循环将值发送到方法,
我注意到在 DataGridView 控件中设置行高很慢。有没有办法让它更快? 最佳答案 我自己造成类似布局延迟的原因与AutoSizeRowsMode 和 AutoSizeColumnsMode
我在其他地方看到过此问题的解决方案,但它们都使用将 DataRowView 设置为等于我的 DataGridViewRow.DataBoundItem,然后使用 DataRowView.Row 属性(
我有一个 DataGridView myGridView.DataSource = GetSomeData() // method called public IQueryable GetSomeDa
我正在尝试在 DataGridView 中显示行。 代码如下: foreach (Customers cust in custList) { s
我正在尝试找出我支持的应用程序中的某些行为。片段是: foreach (DataGridViewRow pGridRow in grdEmail.Rows) { pGridRow.Cells[
这行不通。 var result = from row in grid.Rows where (string) row.Cells["COLUMN_1"].Value == "Test
我正在尝试获取具有最大记录 ID 值的 DataGridViewRow。我能够获取记录 ID 本身,但我需要找到行本身。 这是我获取最大记录 ID 的代码,它工作正常: var addedRow =
当我使用 DataTable作为DataGridView的 DataSource ,我经常需要找到用户选择了哪些行并从 DataTable 中读取特定值(不是 DataGridView) 我想知道是否
在我不断寻求更好地理解 .NET 中的线程安全编程的过程中,我似乎无法弄清楚一个问题,因此我希望 SO 上的某个人可以提供帮助。 我了解,在不使用 Control.Invoke 或 Control.B
我想在触发 DataTable 事件(特别是 DataColumnChangeEvent)时更改 DataGridViewRow 的前景色。为此,我需要获取事件发生所在行的关联 DataGridVie
我是一名优秀的程序员,十分优秀!