使用并行任务更新UI



我有方法

public override void InitializeRow(object sender, InitializeRowEventArgs e)
    {
        if (!e.ReInitialize)
         Task.Factory.StartNew(() =>
            {
                AfterInitializeRow(sender, e);
            });
    }
  public override void AfterInitializeRow(object sender, InitializeRowEventArgs e)
    {            
            foreach (UltraGridColumn ugc in e.Row.Band.Columns)
            {
                if (IsNumeric(ugc.Key))
                {
                    e.Row.Cells[ugc].DroppedDown = true;
                    e.Row.Cells[ugc].ValueList = “Some value”;
                    e.Row.Cells[ugc].SetValue(e.Row.Cells[ugc.Key].Value, false);
                    e.Row.Cells[ugc].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.DropDownList;                        
                }
            }
    }

但在e.Row.Cells[ugc].DroppedDown=true处出现Giving错误;我了解到只有主线程才能更新UI。但有没有可能在更新DroppedDown时只切换到主线程。Bcoz的1000多行是以这种方式初始化的,这使得网格的加载非常缓慢。所以我想在这个过程中做一些并行处理。

FormUserControl中的任何函数中,您都可以使用以下类型的代码:

public void SetText(string text)
{
    if (InvokeRequired)
    {
        BeginInvoke(new Action<string>(SetText), text);
    }
    else
    {
        label1.Text = text;
    }
}

CCD_ 3将是在这种情况下进行更新的控制
这将确保您在UI线程上调用该函数
不过,您仍然应该小心同步,但简单地从另一个线程更新UI就可以很容易地完成。

这个问题的答案是,不应该在InitialzieRow事件中使用线程来设置甚至访问网格或其相关对象上的属性。

相反,你应该首先寻找优化你在这个方法中所做的事情的方法。例如,为什么要将单元格的值设置为它已经具有的值,这行代码应该能够在不影响行为的情况下删除。

此外,提供的所有逻辑都仅基于列键,因此如果该列具有一致的值集,则可以在InitializeLayout中设置该列的ValueList,而不是使用InitializeRow。

相关内容

  • 没有找到相关文章

最新更新