[2014-9-15]异步委托线程高级

昨天悲剧,帮别人调代码,愣没调出来。还没时间写博文了。 忧桑...

昨天的今天写吧,今天也没学,就上了一天的课、

1 首先窗口间数据进行传递。也就是父窗口与子窗口数据进行传递。

用委托实现

①,在同一命名控件下定义委托。

②,在子窗口创建委托实例。

③,在父窗口创建子窗口对象,传递委托方法。

public delegate void SetString(string str);
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.Text = Thread.CurrentThread.ManagedThreadId.ToString();
            //允许其他线程来访问
           // Control.CheckForIllegalCrossThreadCalls = false;
        }

private void btnMain_Click(object sender, EventArgs e)
        {
            FChild fChild = new FChild();
            fChild.SetStr = new SetString(set);
            fChild.Show();
        }
        private void set(string str)

{

this.txtMain.Text=str;
         }
    }

子窗口:

public FChild()
        {
            InitializeComponent();
            this.Text = Thread.CurrentThread.ManagedThreadId.ToString();
        }
        public SetString SetStr;

private void btnChild_Click(object sender, EventArgs e)
        {
            SetStr(this.txtChild.Text);
        }

用多线程实现:

线程之间传递在不同窗口之间不能传递,也就是允许其他线程来访问 当前线程创建的控件

Control.CheckForIllegalCrossThreadCalls = false;//不推荐这个方法

使用Invoke()方法

public delegate void SetTextDel(string txt);

public partial class MainFrm : Form
    {
        private SetTextDel MySetCotrolTxt4OtherThreadDel;

public MainFrm()
        {
            InitializeComponent();

this.Text = Thread.CurrentThread.ManagedThreadId +"";

//允许其他线程来访问 当前线程创建的 控件:Control
            //掩耳盗铃
            //Control.CheckForIllegalCrossThreadCalls = false;

MySetCotrolTxt4OtherThreadDel = new SetTextDel(this.SetText4OtherThread);
        }

private void button1_Click(object sender, EventArgs e)
        {
            //ChildFrm frm = new ChildFrm();
            //frm._SetTextDel = new SetTextDel(SetText);
            //frm.Show();

Thread thread = new Thread(()=>
                                           {
                                               ChildFrm frm = new ChildFrm();
                                               frm._SetTextDel = new SetTextDel(SetText);
                                               frm.ShowDialog();
                                           });
            thread.Start();
        }

public void SetText(string txt)
        {
            //InvokeRequired 当线程执行到此的时候,校验一下txtMessage控件是哪个线程创建的。如果是自己创建的InvokeRequired:fasle反之则为true
            if(this.txtMessage.InvokeRequired)
            {
                this.Invoke(MySetCotrolTxt4OtherThreadDel, txt);
            }
            else
            {
                this.txtMessage.Text = txt;  
            } 
        }

public void SetText4OtherThread(string strTxt)
        {
            this.txtMessage.Text = strTxt;
        }
    }

时间: 2024-08-06 14:02:27

[2014-9-15]异步委托线程高级的相关文章

使用异步委托执行线程(delegate)

由于异步委托产生的线程与应用程序主线程是分开执行的,若主线程要获取异步委托线程的结果,则主线程需要等待异步委托的执行结果. BeginInvoke是Delegate类型的一个方法,它的返回类型为IAsyncResult,通过该接口,可以获得异步委托的执行信息. 1.投票技术:等待异步委托结果的一种方法是投票技术,该技术的实现原理是通过IAsyncResult接口的IsComplete属性来检查委托是否完成了任务.EndInvote方法获取执行结果.举个例子,如下: 执行后的效果: 2.访问等待句

C# 多线程操作之异步委托

标签: 多线程任务nullstringhtml工作 2012-06-29 23:00 1276人阅读 评论(0) 收藏 举报  分类: C/C++/C#/dotnet(126)  目录(?)[+] 在应届生找工作的时候,多线程操作几乎是所有的公司都会问及的一个基本问题. 这里做了一个多线程操作的总结,这里总结了通过异步委托来实现多线程操作. 定义一个委托,是创建一个线程的最简单的方法,并且异步调用它.委托是方法的类型安全的引用.同时委托还智齿异步调用方法. 委托使用线程池来完成异步任务. 当自己

C#基础之--线程、任务和同步:一、异步委托

创建线程的一种简单方式是定义一个委托,并异步调用它.委托是方法的类型安全的引用. Delegate还支持异步地调用方法.在后台Delegate类会创建一个执行任务的线程. 为了说明委托的异步特性,从一个需要一定的时间才能执行完毕的方法开始. TakesAWhile方法至少需要经过第2个变量传递的毫秒数才能执行完,因 为它调用了Thread.Sleep()方法. static int TakesAWhile(int data, int ms) { Console.WriteLine("TakesA

创建线程之异步委托

首先定义一个runtaketime委托: public delegate int runtaketime(int data,int ms); 定义一个静态的方法,参数,返回类型和定义的委托一样 static public int taketime(int data, int ms) { Console.WriteLine("time begin!"); Thread.Sleep(ms); Console.WriteLine("time end!"); return

01-多线程及异步委托

一.多线程: 1.概念: 线程:是Windows任务调度的最小单位.线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针.程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数. 多线程:是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务(代码),也就是说允许单个程序创建多个并行执行的线程来完成各自的任务. 2.为什么要用多线程: ①让计算机"同时"做多件事情,节约时间. ②多线程可以让一个程序“同时”处理多个事情. ③后台运行程序,

委托、泛型委托、异步委托(新人,有问题请指出,有部分代码是拿其他博客主的)

委托 是把一个方法当作一个参数放到声明(deletgate)委托中.给另一个方法时候,或者直接执行委托. 1 class Delegates 2 { 3 public delegate void mydelegate(string msg); 4 static void Main(string[] args) 5 { 6 mydelegate myd = new mydelegate(father.BuyToys); 7 myd("BBB"); 8 Console.Read(); 9

异步委托的简单用例

1 //定义一个委托 2 static Func<int, int, string> delFunc = (a, b) => 3 { 4 Console.WriteLine("委托线程:" + Thread.CurrentThread.ManagedThreadId); 5 return (a + b).ToString(); 6 }; 7 8 static void Main(string[] args) 9 { 10 Console.WriteLine("

C# 委托 线程

delegate匿名方法(匿名函数) 1. 函数和方法等价.匿名方法能够让你声明一个方法体而不需要给它指定一个名字,它们以一个“普通的”方法存在,但是在你的代码中没有任何方法显式调用它.,返回参数不需要声明,会根据[语句块]决定. 2. 匿名方法只能在使用委托的时候创建,它们通过delegate关键字创建或者Lambda表达式(匿名函数).定义方式:delegate(显式参数,显式参数) {语句块} delegate(bool x) { return x ? 1 : 2; } 3. 匿名函数总是

异步委托(APM)使用Func异步操作,处理耗时操作

使用委托进行异步操作,处理一些耗时操作,防止主线程阻塞 使用例子: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace Demo 7 { 8 class Program 9 { 10 11 static void Main(string[] args) 12 { 13 Func<string> fun = new Func<s