使用MVP

时间:2018-05-30 13:05:07

标签: c# winforms async-await mvp

我最近开始使用WinForms通过MVP(PassiveView)模式并坚持使用"如何让自己进行更新,同时演示者会长时间(类似20秒)异步操作"

所以我有一个表单,一个带有UI项目的IView实现:

  • 我的演示者通过Button活动订阅的Click;
  • DataGridView,其中包含复选框列;
  • A ProgressBar;
  • 和两个字段。 CurrentSelectedCount;

那我在那做什么? 在那个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}}并回滚表单以重用它。加,  它看起来并不漂亮。

那么还有比这更有效/更清洁的解决方案吗?

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();
}