C#线程间通信问题!急急急!子线程中新建窗体问题

小弟初学C#,今天在写TCP程序,在主线程中创建了一个TCP线程负责接收数据,现在希望收到数据后启动一个窗口显示收到的数据。用了委托,希望在主线程中新建窗口。但是新启动的... 小弟初学C#,今天在写TCP程序,在主线程中创建了一个TCP线程负责接收数据,现在希望收到数据后启动一个窗口显示收到的数据。用了委托,希望在主线程中新建窗口。但是新启动的窗口总是卡死不动,猜想应该是我写的不对。查了好久搞不定所以希望有大神求助。
希望大神们能给一个程序,实现如下演示功能:
在一个窗口启动后新开一个线程,然后在线程里新开一个窗口传递一个字符串参数在窗口上显示出来不阻塞线程就OK了。
我相信大神们很简单。小弟借以学习然后实现自己的程序。代码直接粘贴也为以后和我一样有困扰的朋友参考,大神必是大家的偶像!小弟万分感激!!
其实是我说的不清楚,我也不需要在线程内部打开,主要TCP线程收到一个信息后能够在一个新窗口中显示出来信息就可以了。我用了 “笹铭” 朋友给的参考写了个,在线程中收到信息后在主线程中用委托异步调用执行新开窗口的操作,但是每次收到信息后电脑就卡死。

这个是主线程中的代码,我是这样写的

上面定义了委托

然后在下面的代码中新建了一个线程并将当前窗口this作为启动参数传递过去。

然后子线程中有一个窗口对象form用于接收传过去的参数,然后在子线程中我调用了

this.form.revMsg(strrecv); //strrev是我接收到的数据,我想放到一个新窗口中显示。就像一些聊天工具那样,有人上线了我就划出一个上线提醒。

不知道我上面的代码是不是有问题,我每次收到数据之后电脑就卡的动不了了,CPU占有100%,只能强制关机。求指教
展开
 我来答
bxfc
2013-05-13 · TA获得超过872个赞
知道小有建树答主
回答量:1104
采纳率:0%
帮助的人:684万
展开全部

为什么要在线程内部打开窗口???

FormMain:
      void LoadData()
        {
            while (true)
            {
                form.SetValue(DateTime.Now.ToString());
                Thread.Sleep(1000);
            }
        }
        Form2 form;
        private void button1_Click(object sender, EventArgs e)
        {
            form = new Form2();
            form.Show();
            //可以设置一个lable,背景为一个动态图片,例如:loading....
            Thread td = new Thread(new ThreadStart(LoadData));
            td.IsBackground = true;
            td.Start();
        }
FormChild:
    public void SetValue(string value)
        {
            if (this.InvokeRequired)
            {
                this.BeginInvoke(new MethodInvoker(delegate() {         this.textBox1.Text = value; }));
            }
            else
            {
                this.textBox1.Text = value;
            }
        }
更多追问追答
追问
我写了个遇到些问题,描述道问题补充上了,求指教!
追答
大概看了下你上面写的。。。。这种不合适啊兄弟。
你的所有UI展示都可以在主线程上去Show
数据传输都走异步就行了
你把UI都放到了子线程上去,这是要搞哪样?
笹铭
2013-05-12
知道答主
回答量:2
采纳率:0%
帮助的人:2971
展开全部
子线程不可以新建窗体的,一个窗体应用程序里面有窗体的线程叫UI线程,也叫主线程。UI线程才能对窗体的控件进行操作,新建窗体也要用UI线程,子线程对UI线程的控件操作会报错。解决的方法是子线程对UI线程使用委托,下面是我使用的异步委托处理方法,
public void Work(byte[] bt, IPEndPoint point)
{
WorkDelegate workDelegate = doWork;
this.BeginInvoke(workDelegate, new object[] { bt, point });
}
其中WorkDelegate声明一个委托workDelegate指向doWork方法,窗体this的BeginInvoke方法异步执行,你可以自己定义doWork方法的内容,在doWork方法里无论是对窗体控件操作还是新建窗体都不会报错了,这是因为执行doWork方法的是UI线程。
如果还有不懂可以再问我。
追问
我按照我理解的写了个,但是遇到些问题,因为追问信息有限,所以我追加到问题补充上了,求指教!谢谢
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
列比度
2013-05-12
知道答主
回答量:4
采纳率:0%
帮助的人:3万
展开全部
告诉我你QQ号码,我给你传一个项目,里面有关一些现成调用的测试程序
追问
百度帐号即所得。谢谢
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sh981013
2013-05-12 · 超过33用户采纳过TA的回答
知道答主
回答量:114
采纳率:0%
帮助的人:88.5万
展开全部
知识点:UI只能由创建这个UI的线程所控制,说UI只能由主线程控制不完全正确,原因是绘制逻辑造成的,这里就不深究了,喜欢这个的可以百度

解决问题关键字:
C# 多线程 传值 跨线程传值 委托 反射

推荐设计模式
观察者模式(有的说是监听者模式)

想要完整的实例的可以百度M我,我可以单独给你写~~
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式