马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

c# 委托事件的用法,报跨线程错误,请大神帮忙看看呀。

[复制链接]
查看4608 | 回复2 | 2015-4-8 10:28:23 | 显示全部楼层 |阅读模式
本帖最后由 txh2002 于 2015-4-8 11:05 编辑

namespace expzpdata
{
    public delegate void DelegateSetProgress(int i);

    public partial class Form1 : Form
    {

       public  event DelegateSetProgress SetProgress;
        public  event DelegateSetProgress SetComplet;
       Thread th1;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog fd = new FolderBrowserDialog();
            fd.SelectedPath = @"c:";
            if (fd.ShowDialog() == DialogResult.OK)
            {
                textBox3.Text = fd.SelectedPath;

            }
            textBox3.Text = fd.SelectedPath;
        }

        private void button2_Click(object sender, EventArgs e)
        {

            this.SetProgress+=new DelegateSetProgress(Form1_SetProgress);
            this.SetComplet += new DelegateSetProgress(Form1_SetComplet);
            th1 = new Thread(expdata);
            th1.Start();

            button2.Enabled = false;

        }

        void Form1_SetComplet(int i)
        {
            label4.Text = "导出行数:  " + i.ToString();
            MessageBox.Show("完成导出数据。");
            button2.Enabled = true;
            throw new NotImplementedException();
        }

        void Form1_SetProgress(int i)
        {
            label4.Text = "导出行数:  " + i.ToString();

            throw new NotImplementedException();
        }


        private void expdata()
        {
            OracleConnection con = new OracleConnection();
            string str = @"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.166.71.2)(PORT=1521))(CONNECT_DATA=(sid=pzhjhk2)));User Id=csi_pzhassword=csi_pzh";
            con.ConnectionString=str;
            string  sql="select aac002,aac003,aac034 from tmp_zp"; //aac002身份证 aac003姓名 aac034照片
            OracleDataReader dr;
            OracleCommand   cmd=new OracleCommand(sql,con);
            con.Open();
            dr=cmd.ExecuteReader();


            FileStream fs = new FileStream(textBox3.Text + "\\" + "zp.xml",FileMode.OpenOrCreate);
            StreamWriter sw=new StreamWriter(fs);
            StringBuilder sb = new StringBuilder();
            sb.Append(@"<?xml version='1.0' encoding='UTF-8'?>");
            sb.Append("<root>");
            int i = 0;
            while (dr.Read())
            {

                sb.Append("<aac001>");
                sb.Append("<aac002>");
                sb.Append(dr[0]);
                sb.Append("</aac002>");
                sb.Append("<aac003>");
                sb.Append(dr[1]);
                sb.Append("</aac003>");
                sb.Append("<aac034>");

                byte[] data =(byte[])dr[2];

                 /* 把读出的blob解码后得到的是一个xml格式字符串,这里再次处理xml文档,只保留xml内部值。    */
                   string s = Encoding.UTF8.GetString(data);
                   XmlDocument xmldoc_t = new XmlDocument();
                   xmldoc_t.LoadXml(s);
                   XmlNodeList nodlist = xmldoc_t.GetElementsByTagName("file");
                   foreach (XmlNode node in nodlist)
                   {
                       sb.Append(node.InnerText);
                   }
                   sb.Append("</aac034>");
                   sb.Append("</aac001>");
                   i++;  //循环计数,每100行写入一次文件。
                   if (i % 100 == 0)
                   {
                       sw.Write(sb.ToString());
                       sw.Flush();
                       sb = new StringBuilder();
                       SetProgress(i);
                       //label4.Text = "导出行数:  " + i.ToString();
                   }

            }
            sw.Write(sb.ToString());
            sw.Flush();
            sw.Close();
            fs.Close();
            //label4.Text = "导出行数:  " + i.ToString();
            SetComplet(i);
           // MessageBox.Show("完成");
        }
    }

txh2002 | 2015-4-8 11:14:39 | 显示全部楼层
委托事件不是可以跨线程吗?为什么在子线程中通过事件更新主界面,会出这个错误啊 invalidoperationexception,线程间操作无效,从不是创建控件“label4”的线程访问它。
ibcadmin | 2015-4-8 21:26:41 | 显示全部楼层
txh2002 发表于 2015-4-8 03:14
委托事件不是可以跨线程吗?为什么在子线程中通过事件更新主界面,会出这个错误啊 invalidoperationexcepti ...

在窗体加载事件上写 Control.CheckForIllegalCrossThreadCalls = false;
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则