【问题标题】:Asynchronous UserControl异步用户控件
【发布时间】:2015-01-28 01:40:19
【问题描述】:

我创建了自己的图表库。到目前为止一切正常,除了绘图部分不是并发的。我怎样才能做到这一点?现在我的屏幕在向图表控件添加项目时冻结。我尝试将添加函数重写为Task.Run(()=> { adding to the ObservableCollection }),但没有成功。

是否只在库async 中创建所有方法?如果是,由于我至少需要一个Task,我应该返回什么?

我的意思是一般来说,是否有另一种方法来创建异步控件?我的愿望是有一个像ListView 这样的控件,我可以在其中添加项目,并将新项目同时添加到列表中。

【问题讨论】:

  • 你用的是wpf还是winform?
  • 如果基本的listOfItems.Add(existingItem);Invalidate(); 冻结了您的视图,再多的异步代码也无济于事……(此外,您对“将项目添加到图表”的定义可能非常不同,但我建议拼写它如果是这种情况,请退出)。

标签: c# concurrency windows-runtime async-await


【解决方案1】:

UI 控件是线程仿射的,它们只能从 UI 线程处理,这就是您看到 Task.Run 失败的原因。

一般规则是,CPU 密集型工作占用 UI 的时间不应超过 50 毫秒。如果您要使用 UI 控件处理大量数据,请尝试将工作分批到较小的工作组中,并在迭代之间释放您的 UI 线程。

一般来说,你不应该暴露asynchronous wrappers over sync methods

让用户明确地将他的任何工作卸载到后台线程。

【讨论】:

  • 谢谢,这意味着一切都是时间问题? “如果您有大量数据要使用 UI 控件处理,请尝试将工作分批成较小的工作组,并在迭代之间释放您的 UI 线程。”这是什么意思?如何释放 UI?
  • @Dani - 将大列表分成子列表,也许使用await Task.Delay(50); 让用户界面“呼吸”
猜你喜欢
  • 1970-01-01
  • 2010-09-21
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多