背景:在winform UI中,有时需要对控件进行比较频繁的刷新,如进度条、picturebox显示视频等。如果在主线程进行这些刷新操作,操作还未完成就将执行下一次刷新,程序将发生错误;如果只是创建另一个线程执行这些操作,将和主线程产生竞争,造成界面锁死(因此windows GUI编程有一个规则,就是只能通过创建控件的线程来操作控件的数据,否则就可能产生不可预料的结果)。这时候,我们就可以用委托与异步来解决这个问题。

  委托:回顾一下委托 ,一、定义委托,委托定义的参数与传递给委托的方法的参数一致。二、声明与实例化。三、调用,将委托作为参数供方法调用。 

  异步:Windows窗体控件,唯一可以从创建它的线程之外的线程中调用的是Invoke()、BeginInvoke()、EndInvoke()方法和InvokeRequired属性。这些方法会切换到创建控件的线程上,以调用赋予一个委托参数的方法,该委托参数可以传递给这些方法。

    关于Invoke()与BeginInvoke():其中BeginInvoke()、EndInvoke()方法是Invoke()方法的异步版本。相同点:都需要一个委托对象作为参数。不同点:Invoke()是同步方法,Invoke封送的方法被执行完毕前,Invoke()不会返回,从而调用者线程将被阻塞;需要等待UI操作执行完毕后继续执行线程时考虑使用。而BeginInvoke()相反,是异步方法,方法调后立即返回,不用等待委托方法的执行结束,主线程就不会阻塞。

    Delegate.BeginInvoke方法从ThreadPool取出一个线程来执行这个方法,以获得异步执行效果。Control.BeginInvoke方法并不会另开线程。

  参考:http://blog.csdn.net/stxyc/article/details/16945581

  初学C#,理解的不是很透彻,一步一步来,循序渐进。

  下面是一个进度条的小程序:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace progressBar
{
public partial class Form1 : Form
{
delegate void ShowProgressDelegate();
delegate void RunTaskDelegate(); public Form1()
{
InitializeComponent(); this.progressBar1.Maximum = ;
this.progressBar1.Step = ;
} private void startBtn_Click(object sender, EventArgs e)
{
RunTaskDelegate runTask = new RunTaskDelegate(RunTask);
// 委托异步调用方法
runTask.BeginInvoke(null, null);
} private void closeBtn_Click(object sender, EventArgs e)
{
this.Close();
} //进度条增加
void ShowProgress()
{
this.progressBar1.PerformStep();
} //模拟工作方法
public void RunTask()
{
ShowProgressDelegate showProgress = new ShowProgressDelegate(ShowProgress); int iTotal = ;//工作量
for (int i = ; i < iTotal; i++)
{
System.Threading.Thread.Sleep();//模拟工作
this.BeginInvoke(showProgress);
}
} }
}

  我目前的理解是:RunTaskDelegate的作用是从另一个线程调用RunTask()方法(此方法中包含主线程的休眠),可以避免休眠期间界面无响应。ShowProgressDelegate的作用就是异步调用ShowProgress()方法,从而避免非UI线程操作控件产生的异常。

c# 委托与异步调用的更多相关文章

  1. C#委托的异步调用1

    本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: /*添加的命名空间 u ...

  2. C#委托的异步调用

    本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: /*添加的命名空间 u ...

  3. C#委托的异步调用【转】

    本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: ); //模拟该方法运 ...

  4. [转]C#委托的异步调用

    本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: ); //模拟该方法运 ...

  5. ASP.NET 委托,异步调用例子 .

    简要介绍:1.定义异步执行需要调用的方法2.定义具有与异步执行方法相同签名的委托(Delegate):3.调用 BeginInvoke 和 EndInvoke 方法.   3.1. BeginInvo ...

  6. C# 委托的三种调用示例(同步调用 异步调用 异步回调)

    首先,通过代码定义一个委托和下面三个示例将要调用的方法: 复制代码 代码如下: public delegate int AddHandler(int a,int b);    public class ...

  7. 那些年我们一起追逐的多线程(Thread、ThreadPool、委托异步调用、Task/TaskFactory、Parallerl、async和await)

    一. 背景 在刚接触开发的头几年里,说实话,根本不考虑多线程的这个问题,貌似那时候脑子里也有没有多线程的这个概念,所有的业务都是一个线程来处理,不考虑性能问题,当然也没有考虑多线程操作一条记录存在的并 ...

  8. C# 委托的同步调用和异步调用

    委托的Invoke方法用来进行同步调用.同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行. 同步调用的例子: using System; using System.T ...

  9. C# 委托的三种调用示例(同步调用、异步调用、异步回调)

    首先,通过代码定义一个委托和下面三个示例将要调用的方法: 代码如下: public delegate int AddHandler(int a,int b); public class 加法类 { p ...

随机推荐

  1. 问题:关于贴友一个用js传递value默认值的简单实现

    需求和代码如下: “这是我的代码:” 1: <input type="text" id="price2" value="333"/&g ...

  2. DP——最优三角形剖分

    [动态规划]凸多边形最优三角剖分 枚举三角行,再递归三角形旁边的两个多边形.

  3. 【转载】sed命令详解

    [转载自]http://www.cnblogs.com/edwardlost/archive/2010/09/17/1829145.html   sed -i  把后面的操作后的文本输出回原文本   ...

  4. java@ What are C++ features missing in Java

    Following features of C++ are not there in Java. No pointers No sizeof operator No scope resolution ...

  5. POJ 3419 Difference Is Beautiful(RMQ变形)

    题意:N个数,M个询问,每个询问为一个区间,求区间最长连续子序列,要求每个数都不同(perfect sequence,简称PS). 题解:很容易求出以每个数为结尾的ps,也就是求区间的最大值.有一个不 ...

  6. Umbraco中的ModelBuilder

    Umbraco中的ModelBuilder有以下几种形式 Pure Live models Dll models LiveDll models AppData models LiveAppData m ...

  7. Modbus调试利器 Modbus Poll

    Modbus Poll是一个非常不错的工具,支持TCP/串口 下载地址:http://pan.baidu.com/share/link?shareid=2880213929&uk=248325 ...

  8. Quartus II调用modelsim无缝仿真

    本篇文章为转载,写的不错,最近在学modelsim仿真,网上的教程很乱,把自己认为不错的整理贴出来,后面有机会会写个详细点的. Quartus 中调用modelsim的流程 1. 设定仿真工具 ass ...

  9. SQL Server 2005 盛宴系列 经典教程

    SQL Server 2005 盛宴系列 经典教程  [复制链接]   发表于 2007-3-27 14:08 | 来自 51CTO网页 [只看他] 楼主     TECHNET  SQL serve ...

  10. ECSHOP在线手册布局参考图--通用活动页 group_list.dwt等

        A.购物车 1,设置方法 程序自动读取购物车的商品数量 2,代码相关 cart.lbi 中 {insert_scripts files='transport.js'} <div clas ...