首页  :: 新随笔  :: 订阅 订阅  :: 管理

delegate.BeginInvoke跟control.invoke ┅

Posted on 2007-12-26 10:48  礼拜一  阅读(2803)  评论(6编辑  收藏  举报
                                Return          Work Thread

Control.Invoke                  完成工作        强制於 UI Thread
Control.BeginInvoke             立即            强制於 UI Thread
[delegate].Invoke               完成工作        Call Invoke 的 Thread
[delegate].BeginInvoke          立即            新的背景 Thread

-------------------------------------------------------------------------

1、Button = button1
2、TextBox = textBox1 (请设 multiline)

然後把 button1 的 OnClick 连到下面 source code 里的 button1_Click

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public delegate void testDelegate(string text);

        public Form1()
        {
            InitializeComponent();
        }

        private void UpdateTextBox(string text)
        {
            textBox1.Text += string.Format("{0}{1}", text, Environment.NewLine);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            testDelegate t = new testDelegate(UpdateTextBox);
            this.Invoke(t, "Control.Invoke");
            this.BeginInvoke(t, "Control.BeginInvoke");

            t.Invoke("[delegate].Invoke");
            // 建议先 comment 掉下面这行跑一次,再拿掉 comment 跑一次
            // 下面这行就是所谓的 [delegate].BeginInvoke
            // 但是当你 call 了之後,在 UpdateTextBox 里会出现 exception
            // 因为它使用新的背景 thread 来跑这个工作
            // 但是 Form 不允许由别的 thread 来 access Form 上的任何 control
            // t.BeginInvoke("[delegate].BeginInvoke", null, null);
        }
    }
}