苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 6232|回复: 4

[其他] C#多线程问题

[复制链接]
发表于 2013-5-24 15:09:39 | 显示全部楼层 |阅读模式
我想在这个事件中采用线程调用TypeShowFrom方法,这个方法里面涉及到UI控件问题,我该怎么做
//在更改选中的树节点发生的事件
     
[C#] 纯文本查看 复制代码
   private void tvMainMenu_AfterSelect(object sender, TreeViewEventArgs e)
        {
            try
            {
                //Thread td = new Thread(new ThreadStart(ThreadFunShow));
                //td.Start(e);
                ////BeginInvoke(new Action(() =>
                ////{
                ////    TypeShowFrom(e);
                ////}));
              
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

调用下面的方法
[C#] 纯文本查看 复制代码
/// <summary>
        /// show出窗体
        /// </summary>
        /// <param name="type"></param>
        public void TypeShowFrom(TreeViewEventArgs e)
        {
            Form frm = null;
            if (e.Node.Name != "")
            {
                if (!HasChildrenForm)
                {
                    this.pPrompt.Visible = false;//程序温馨提示容器隐藏
                    this.pLoading.Visible = true;
                    this.Refresh();
                    string type = e.Node.ToolTipText;
                    LoginInfo.parameter = e.Node.Name;
                    int n = e.Node.Text.IndexOf('(');
                    string text = n > 0 ? e.Node.Text.Remove(n) : e.Node.Text;
                    switch (type)
                    {
                        case "answerAndCommentsExamine":
                            string[] typeName = LoginInfo.parameter.Split('_');
                            if (typeName[typeName.Length-1].Equals("SINAASK"))
                            {
                                PublicData.formType = text.Equals("评论审核") ? "SINAASK_Comment" : "SINAASK_Answer";
                            }
                            else
                            {
                                PublicData.formType = text.Equals("评论审核") ? "Ordinary_Comment" : "Ordinary_Answer";
                            }
                            frm = new frm_CommentAdnAnswerAudit();
                            frm.MdiParent = this;
                            frm.Text = text;
                            frm.Show();
                            Application.DoEvents();
                            break;
                        case "weiBoCollect":
                            frm = new frm_WeiBoCollect();
                            frm.MdiParent = this;
                            frm.Text = text;
                            frm.Show();
                            break;
                        case "commentsSolutions":
                            frm = new frm_CommentsSolutions();
                            frm.MdiParent = this;
                            frm.Text = text;
                            frm.Show();
                            Application.DoEvents();
                            break;
                        case "questionAnswering":
                            PublicData.type = text.Equals("官方解答") ? "official" : "common";
                            frm = new frm_QuestionAnswering();
                            frm.MdiParent = this;
                            frm.Text = text;
                            frm.Show();
                            Application.DoEvents();
                            break;
                        case "questionExamine":
                            frm = new frm_QuestionAudit();
                            frm.Text = text;
                            frm.MdiParent = this;
                            frm.Show();
                            Application.DoEvents();
                            break;
                        case "askQuestionExamine":
                            frm = new frm_SinasHelp();
                            frm.Text = text;
                            frm.MdiParent = this;
                            frm.Show();
                            Application.DoEvents();
                            break;
                        default:
                            break;
                    }
                    this.tvMainMenu.SelectedNode = null;
                    this.pLoading.Visible = false;
                    frm.FormClosed += frm_FormClosed;
                }
            }
        }

本帖被以下淘专辑推荐:



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-5-24 15:14:47 | 显示全部楼层
UI控件需要使用委托访问,这个你参数例子
http://www.sufeinet.com/thread-13-1-1.html
发表于 2013-5-24 15:17:51 | 显示全部楼层
你这个其实就是跨线程访问的问题
看下面代码
[code=csharp]&#160;&#160;//创建一个委托,是为访问TextBox控件服务的。
&#160; &#160;&#160; &#160;&#160;&#160;public delegate void UpdateTxt(string msg);
&#160; &#160;&#160; &#160;&#160;&#160;//定义一个委托变量
&#160; &#160;&#160; &#160;&#160;&#160;public UpdateTxt updateTxt;

&#160; &#160;&#160; &#160;&#160;&#160;private void Form1_Load(object sender, EventArgs e)
&#160; &#160;&#160; &#160;&#160;&#160;{
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;updateTxt = new UpdateTxt(UpdateTxtMethod);
&#160; &#160;&#160; &#160;&#160;&#160;}
&#160; &#160;&#160; &#160;&#160;&#160;//修改TextBox值的方法。
&#160; &#160;&#160; &#160;&#160;&#160;public void UpdateTxtMethod(string msg)
&#160; &#160;&#160; &#160;&#160;&#160;{
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;this.txt.Text = msg;
&#160; &#160;&#160; &#160;&#160;&#160;}
&#160; &#160;&#160; &#160;&#160;&#160;//此为在非创建线程中的调用方法,其实是使用TextBox的Invoke方法。
&#160; &#160;&#160; &#160;&#160;&#160;public void ThreadMethodTxt(string msg)
&#160; &#160;&#160; &#160;&#160;&#160;{
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;this.txt.Invoke(UpdateTxt, new object[] { msg });
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;//以下是苏飞修改部分
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;//this.txt.Invoke(updateTxt, new object[] { msg });
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;//updateTxt(msg)
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;//如果是窗体的可以这样写
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;//&#160;&#160;this.BeginInvoke(updateTxt, msg);
&#160; &#160;&#160; &#160;&#160;&#160;}
[/code]
原文http://www.sufeinet.com/thread-2200-1-1.html
发表于 2013-7-31 21:09:39 | 显示全部楼层
受教了,学习中……
发表于 2013-8-1 09:50:07 | 显示全部楼层
受教了,学习中……
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-27 00:52

© 2014-2021

快速回复 返回顶部 返回列表