[C#] UI跨执行绪

1 篇文章 0 订阅

当使用子执行绪(Other Thread)更新主执行绪所显示的UI元件时,通常会遇到「跨执行绪作业无效: 存取控制项… 时所使用的执行绪与建立控制项的执行绪不同」这个错误,可以利用UI.InvokeRequired来进行判断跨执行绪的问题与导正回主执行绪。

在多执行绪(线程)编程中,我们经常要在工作执行绪(线程)中去更新介面显示,而在多执行绪(线程)中直接调用介面控制元件的方法是错误的做法,Invoke 和BeginInvoke就是为了解决这个问题而出现的,使你在多执行绪(线程)中安全的更新介面显示。

正确的做法是将工作执行绪(线程)中涉及更新介面的程式码封装为一个方法(method),通过Invoke 或者BeginInvoke 去呼叫,两者的区别就是一个导致工作执行绪(线程)等待,而另外一个则不会。

而所谓的"一面响应操作,一面添加节点" 永远只能是相对的,使UI 执行绪(线程)的负担不至于太大而已,因为介面的正确更新始终要通过UI执行绪(线程)去做,我们要做的事情是在工作执行绪(线程)中囊括大部分的运算,而将对纯粹的介面更新放到UI执行绪(线程)中去做,这样也就达到了减轻UI 执行绪(线程)负担的目的了。

以下例子说明下使用方法method,比如你在呼叫一个执行绪(线程),在执行绪(线程)的方法中想更新Form中的一个TextBox.

using System.Threading;

//啟動一個執行緒(線程)
Thread thread=new Thread(new ThreadStart(DoWork));
thread.Start();

//執行緒(線程)方法
private void DoWork()
{
     this.TextBox1.Text="我是一個Textbox";
}

如果你像上面操作,在VS2005或2008里是会有异常的…

正确的做法是用Invoke/BeginInvoke

using System.Threading;
namespace test
{
    public partial class Form1 : Form
    {
        public delegate void MyInvoke(string str1,string str2);
        public Form1()
        {
            InitializeComponent();

 }
        public void DoWork()
        {
             MyInvoke mi = new MyInvoke(UpdateForm);
             this.BeginInvoke(mi, new Object[] {"我是Textbox","haha"});
        }
        public void UpdateForm(string param1,string parm2)
        {
            this.textBox1.Text = param1+parm2;
        }

        private void button1_Click(object sender, EventArgs e)
        {
             Thread thread = new Thread(new ThreadStart(DoWork));
             thread.Start();
        }
    }
}

->注意委派(代理)的使用!

基本上delegate(委派)是一种型别安全(Type-Safe)的函式指标,他可以对于某个方法进行同步叫用,但对于独立的执行绪中他是以非同步的方法来叫用。至于Invoke则是用来叫用委派的方法,委派另外还提供了两个呼叫非同步的方法BeginInvoke及EndInvoke,其中BeginInvoke又会传回一个IAsyncResult。

至于程式码您可以参考一下MSDN文件库:(里面有范例程式码及详细说明)
事件和委派
http://msdn.microsoft.com/zh-tw/library/17sde2xt(VS.80).aspx

在建立控制项基础控制代码的执行绪上执行指定的非同步委派。
http://msdn.microsoft.com/zh-tw/library/0b1bf3y3(VS.85).aspx

IAsyncResult介面
http://msdn.microsoft.com/zh-tw/library/system.iasyncresult.aspx

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值