我最近开始使用WinForms
通过MVP(PassiveView)模式并坚持使用"如何让自己进行更新,同时演示者会长时间(类似20秒)异步操作"
所以我有一个表单,一个带有UI项目的IView
实现:
Button
活动订阅的Click
; DataGridView
,其中包含复选框列; ProgressBar
; Current
和SelectedCount
; 那我在那做什么?
在那个Click
上,我的Presenter抓住了#34;检查了#34; datagrid中的项目并将它们写入数据库
由于该处理需要时间,因此我使用了这种方法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(例如在同一个委托中){{ 1}}并回滚表单以重用它。加, 它看起来并不漂亮。
那么还有比这更有效/更清洁的解决方案吗?
答案 0 :(得分:0)
为什么不使用背地面工人,相当老派,但是好好学习。 Click here了解有关后台工作人员的更多信息。您可以像这样使用Background-Worker:
private void Main(string[] args)
{
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += Bw_DoWork;
bw.RunWorkerCompleted += Bw_RunWorkerCompleted;
//Parameter you need to work in Background-Thread for example your strings
string[] param = new[] {"Text1", "Text2", "Text3", "Text4"};
//Start work
bw.RunWorkerAsync(param);
}
//Do your Background-Work
private void Bw_DoWork(object sender, DoWorkEventArgs e)
{
string[] param = e.Argument as string[];
//Process your long running task
e.Result = null; //Set your Result of the long running task
}
//Taking your results
private void Bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//Apply your Results to your GUI-Elements
myTextBox1.Text = e.Result.ToString();
}