【发布时间】:2018-05-30 13:05:07
【问题描述】:
我最近开始通过 MVP (PassiveView) 模式使用 WinForms 并坚持
“如何在演示者进行长时间(大约 20 秒)异步操作时让 View 自行更新”
所以我有一个表单,一个带有 UI 项的 IView 实现:
- 一个
Button,我的演示者通过Click事件订阅它; - 带有复选框列的
DataGridView; - 一个
ProgressBar; - 和两个字段。
Current和SelectedCount;
那我在那里做什么呢?
在那个Click 上,我的演示者从数据网格中抓取“已检查”项目并将它们写入数据库。
由于那个处理需要时间,我做了这个方法async:
private async void PutToDatabase(List<Item> items)
{
View.SelectedCount = items.Count;
for (int i = 0; i < items.Count; i++)
{
await Task.Factory.StartNew(
() =>
{
// writing stuff to database via ADO.NET
View.Current = i;
});
}
}
所以我正在更新我的 Current,它通过这样做来更新我的 progressBar:
public int CurrentPrice
{
get { return _current; }
set
{
_current = value;
Invoke((MethodInvoker) delegate {progBarImportState.Value = _current; });
}
}
我不确定这种方法是否能正常工作,因为我无法重新加载我的 UI 以再次使用表单,除非我要检查 somwhere(例如在同一个委托中)if progress.value == progress.maximum 并回滚表单以重用它。加,
它看起来并不“漂亮”。
那么还有比这更有效/更清洁的解决方案吗?
【问题讨论】:
标签: c# winforms async-await mvp