首页 > 解决方案 > 如何防止ListView排序阻塞程序

问题描述

我有一个包含数百个项目的列表,当我尝试对项目进行排序时,它总是阻止我的程序。这太烦人了。我尝试使用 Task.Run(),它不起作用。

private void resultListView_ColumnClick(object sender, ColumnClickEventArgs e)
{
    // doesn't work
    Task.Run(() => ListViewOperate((ListView)sender, ListViewOP.SORT));

    // doesn't work
    resultListView.BeginUpdate();
    ListViewOperate((ListView)sender, ListViewOP.SORT);
    resultListView.EndUpdate();
}


private delegate void ListViewOperateDelegate(System.Windows.Forms.ListView liv, 
     ListViewOP op);
private void ListViewOperate(System.Windows.Forms.ListView liv, ListViewOP op)
{ 
   if (liv.InvokeRequired)
        {
            var addDele = new ListViewOperateDelegate(ListViewOperate);
            liv.Invoke(addDele, new object[] { liv, op});
   }
   else
   {
      if (op == ListViewOP.SORT)
      {
         liv.BeginUpdate();
         liv.Sort();
         liv.EndUpdate();
      }
   }
}

标签: c#sortinglistview

解决方案


您尝试使用的技巧在这里不起作用,因为您在线程/任务上启动 ListViewOperator 但回调检查它是否在 UI 线程上启动。如果它不在 UI 线程上,请在 UI 线程上调用它。那么你获得了什么好处呢?没有任何..

您应该检查虚拟模式。使用虚拟模式,您可以对任务/线程上的列表进行排序(副本),然后交换列表“变量”并触发列表视图自行刷新。

这是一个例子


推荐阅读