使用MVP WIndows表单进行跨线程调用

问题描述 投票:1回答:1

我想为WinForm应用程序使用MVP设计模式,但我面临从另一个线程调用View Update的问题。

这是我的代码

模型

public class Model : IModel
{
    public string Status { get; set; }

    public async void LongOperation(IHomeView View)
    {          

        for (int i = 0; i < 1000; i++)
        {
            View.StatusListView = i.ToString();
        }
    }
}

主持人

public class HomePresenter
{
    IHomeView _IView;
    IModel _IModel;

    Model _Model = new Model();

    public HomePresenter(IHomeView IView)
    {
        _IView = IView;                                 
    }        

    public async void LaunchLongOperation()
    {           
        await Task.Run(() => _Model.LongOperation(_IView));            
    }


}

INTERFACE VIEW-PRESENTER

public interface IHomeView
{
    string StatusListView { get; set; }
}

界面主播模型

public interface IModel
{
    string Status { get; set; }
}

形成:

public partial class frmMain : Form, IHomeView
{
    HomePresenter _Presenter;

    public frmMain()
    {
        InitializeComponent();
        _Presenter = new HomePresenter(this);      
    }



    public string StatusListView
    {
        get
        {
            return lstActivityLog.Text;
        }
        set
        {
            lstActivityLog.Items.Add(value);
        }
    }

    private void btnAvvia_Click(object sender, EventArgs e)
    {
        _Presenter.launchLongOperation();
    }        
}

我想在Model类的长期操作期间更新Main表单中的列表视图。

哪种方法最好?

c# multithreading mvp
1个回答
0
投票

试试这段代码而不进行调试,你会感到惊讶它的工作原理!

使它在调试模式下工作的快速而肮脏的方法是将Control.CheckForIllegalCrossThreadCalls = false;添加到表单的构造函数中。

public partial class MainForm : Form, IHomeView
    {
        HomePresenter _Presenter;
        public MainForm()
        {
            InitializeComponent();
            Control.CheckForIllegalCrossThreadCalls = false;   //<-- add this
            _Presenter = new HomePresenter(this);
        }

        public string StatusListView
        {
            get
            {
                return lstActivityLog.Text;
            }
            set
            {
                 lstActivityLog.Items.Add(value);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            _Presenter.LaunchLongOperation();
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.