zoukankan      html  css  js  c++  java
  • 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);
                }
            }
        }
  • 相关阅读:
    ubuntu 用shell脚本实现将当前文件夹下全部文件夹中的某一类文件复制到同一文件夹下
    读书笔记-2java虚拟机的可达性算法与finalize方法
    find the longest of the shortest (hdu 1595 SPFA+枚举)
    杭电 2176 取(m堆)石子游戏(博弈)
    MVC框架的优缺点
    Wireshark-TCP协议分析(包结构以及连接的建立和释放)
    Ubuntu安装教程--Win7系统中含100M保留分区
    eclipse新建android项目出现非常多错误
    关于简单的加密和解密算法
    在一台server上部署多个Tomcat
  • 原文地址:https://www.cnblogs.com/wupeihong/p/3699551.html
Copyright © 2011-2022 走看看