C# 多线程和界面交互问题

mrnian2008 2014-01-23 08:55:40
本人多线程知识薄弱,偶尔凑合着用过,但是再加上界面操作问题就抓瞎了。现在我的程序里要开十多个线程,每个线程在开启的时候,相应的我要在TabControl里新建一个TabPage与线程对应,线程执行的信息需要反应到TabPage上的各个相关显示控件,TabPage上的各个控件操作的情况也要及时传递给线程并干预线程的执行内容,这个怎么实现,谁有例程给一个,或者是讲一讲方法,谢过!
...全文
914 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
huyosh 2014-02-03
  • 打赏
  • 举报
回复
用delegate委托就可以啦
iloli 2014-01-29
  • 打赏
  • 举报
回复
引用 11 楼 mimrc7993 的回复:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace Model
{
    public static class ControlExtended
    {
        public delegate void InvokeHandler();
        /// <summary>
        /// 线程操作Invoke
        /// </summary>
        /// <param name="control"></param>
        /// <param name="handler"></param>
        public static void UIInvoke(this Control control, InvokeHandler handler)
        {
            if (control.InvokeRequired)
            {
                control.Invoke(handler);
            }
            else
            {
                handler();
            }
        }
    }
}

//调用
private void button3_Click(object sender, EventArgs e)
        {
             Thread tdAdd = new Thread(function);
             tdAdd.Start();
        }
public void function()
        {
            this.UIInvoke(() =>
            {
               //执行代码
            });
        }
哇。好高深。还对Control使用了扩展方法~~~
iloli 2014-01-29
  • 打赏
  • 举报
回复
开多线程楼主应该是会的。主要的问题应该是跨线程调用的问题吧。 有一个叫INVOKE的神器。研究好它 基本上大多数的跨线程调用问题都能解决
erictang2003 2014-01-28
  • 打赏
  • 举报
回复
其实就是ui 只能在创建UI元素的线程上调用。Dispather.Invoke,其他的自己慢慢琢磨吧。多线程可不是几句话能说清楚的,这里面花样太多。你看.net4.5不就是在多线程,异步上做了改进。你去看文档,都会推荐你用Task,但是Task的问题在哪?没人告诉你。你要自己琢磨。这里面还有闭包的问题。自己学吧。
_学而时习之_ 2014-01-28
  • 打赏
  • 举报
回复
方式一:在线程中使用Invoke来刷新数据,并不断的读取UI中的数据。 方式二:使用数据双向绑定,这样一来,线程中的数据就可以即时的刷新到UI中,同时UI中数据的改变也可以即时的反馈到线程中。
Conmajia 2014-01-27
  • 打赏
  • 举报
回复
引用 5 楼 u011978868 的回复:
[quote=引用 1 楼 conmajia 的回复:] 不解释 http://http://bbs.csdn.net/topics/390162519
不解释打不开啊[/quote]你都不看你点击的是什么东西。。真捉急。。
mrnian2008 2014-01-25
  • 打赏
  • 举报
回复
引用 9 楼 wanby1982 的回复:
delegate void SetpicsiziCallback(string xiaoxi); private void SetXiaoXi(string xiaoxi) { if (this.InvokeRequired) { SetpicsiziCallback d = new SetpicsiziCallback(SetXiaoXi); this.Invoke(d, new object[] { xiaoxi }); } else { this.toolStripStatusLabel1.Text = xiaoxi; } } 直接调用SetXiaoXi赋值
这个我在用,是从线程里向界面刷新消息的,我还需要将界面事件通知线程,以控制线程的工作。
wanby1982 2014-01-25
  • 打赏
  • 举报
回复
delegate void SetpicsiziCallback(string xiaoxi); private void SetXiaoXi(string xiaoxi) { if (this.InvokeRequired) { SetpicsiziCallback d = new SetpicsiziCallback(SetXiaoXi); this.Invoke(d, new object[] { xiaoxi }); } else { this.toolStripStatusLabel1.Text = xiaoxi; } } 直接调用SetXiaoXi赋值
寂小魔 2014-01-25
  • 打赏
  • 举报
回复

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace Model
{
    public static class ControlExtended
    {
        public delegate void InvokeHandler();
        /// <summary>
        /// 线程操作Invoke
        /// </summary>
        /// <param name="control"></param>
        /// <param name="handler"></param>
        public static void UIInvoke(this Control control, InvokeHandler handler)
        {
            if (control.InvokeRequired)
            {
                control.Invoke(handler);
            }
            else
            {
                handler();
            }
        }
    }
}

//调用
private void button3_Click(object sender, EventArgs e)
        {
             Thread tdAdd = new Thread(function);
             tdAdd.Start();
        }
public void function()
        {
            this.UIInvoke(() =>
            {
               //执行代码
            });
        }
BenBenBears 2014-01-24
  • 打赏
  • 举报
回复
跨线程更新UI一般会用到委托。
richard_1015 2014-01-24
  • 打赏
  • 举报
回复
引用 1 楼 conmajia 的回复:
不解释 http://http://bbs.csdn.net/topics/390162519
不解释打不开啊
Conmajia 2014-01-24
  • 打赏
  • 举报
回复
引用 3 楼 zongbao516 的回复:
[quote=引用 1 楼 conmajia 的回复:] 不解释 http://http://bbs.csdn.net/topics/390162519
不解释什么?能打开吗?[/quote]观察力捉急
无常名 2014-01-24
  • 打赏
  • 举报
回复
引用 1 楼 conmajia 的回复:
不解释 http://http://bbs.csdn.net/topics/390162519
不解释什么?能打开吗?
  • 打赏
  • 举报
回复
你可以先学习 BackgroundWorker.
  • 打赏
  • 举报
回复
Async http://msdn.microsoft.com/library/default.aspx 骚年祝你自学成才
BenBenBears 2014-01-24
  • 打赏
  • 举报
回复
Conmajia 2014-01-23
  • 打赏
  • 举报
回复

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧