• Winform中子线程访问界面控件时被阻塞解决方案


    public partial class WebData_Import : Form
        {
            //声明用于访问主界面的委托类型
            public delegate void deleGetOrderdata(string info);
            //声明访问主界面委托类型的变量
            public deleGetOrderdata OptGetOrderData;
            int CompanyID = 0;
            public WebData_Import()
            {
                InitializeComponent();
                cmbCompany.Items.Insert(0, "公司001");
                cmbCompany.Items.Insert(1, "公司002");
                cmbCompany.SelectedIndex = 0;
                //实例化委托
                OptGetOrderData = new deleGetOrderdata(ShowOperationInfo);
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                txtOperationInfo.Text = "";
                switch (cmbCompany.SelectedIndex)
                {
                    case 0:
                        CompanyID = 001;
                        break;
                    case 1:
                        CompanyID = 002;
                        break;
                }
                //执行获取订单数据线程
                Thread GetOrderDataThread = new Thread(new ThreadStart(ExecuteGetOrderData));
                GetOrderDataThread.Start();
            }
    
            /// <summary>
            /// 访问主界面的方法
            /// </summary>
            /// <param name="ShowInfo"></param>
            private void ShowOperationInfo(string ShowInfo)
            {
                txtOperationInfo.Text += ShowInfo + "
    ";
            }
    
            private void ExecuteGetOrderData()
            {
                DataTable GetOrderData = new DataTable();
                //使用BeginInvoke从子线程访问主界面,传入访问主界面的方法和参数
                this.BeginInvoke(OptGetOrderData, "1、导入数据操作开始");
                this.BeginInvoke(OptGetOrderData, "
    2、正在获取数据,请稍后...");
                try
                {
                    GetOrderData = GetOrderTable(CompanyID, Convert.ToDateTime(Sdate.Text), Convert.ToDateTime(Edate.Text));
                    if (GetOrderData == null)
                    {
                        throw new Exception("没有从远程服务获取到任何数据");
                    }
                    this.BeginInvoke(OptGetOrderData, "
    3、已获取" + GetOrderData.Rows.Count + "条数据,正在执行往数据库插入操作...");
                    SQLDBHELPER help = new SQLDBHELPER();
                    int InsertCount = help.SqlInsertBuilder(GetOrderData);
                    this.BeginInvoke(OptGetOrderData, "
    4、成功插入" + InsertCount + "条数据,正在执行存储过程请稍后...");
                    string ErrorMessage = help.exectrans();
                    if (string.IsNullOrEmpty(ErrorMessage.Trim()))
                    {
                        this.BeginInvoke(OptGetOrderData,"
    5、存储过程执行成功,所有操作均已成功执行完毕!");
                    }
                    else
                    {
                        this.BeginInvoke(OptGetOrderData, "
    5、存储过程执行失败!失败原因:" + ErrorMessage);
                    }
                }
                catch (Exception ex)
                {
                    this.BeginInvoke(OptGetOrderData, "
    系统执行异常,异常原因:" + ex.Message);
                }
            }
        }
  • 相关阅读:
    django 笔记4 数据库操作
    html关于不换行代码
    之前搭建的jenkins的一些笔记
    pip报错
    ssh 免密及加密远程脚本实现
    今天了解了些redis和memcached的知识
    django 笔记3
    来选择一款适合你网站的CMS建站程序吧
    如何预防和检测网页挂马?
    网页挂马方式
  • 原文地址:https://www.cnblogs.com/wupeihong/p/3699551.html
Copyright © 2020-2023  润新知