委托的异步

1.委托的异步使用BeginInvoke,这样程序执行时不需要等待委托的函数执行完以后再执行下一句。

但是委托的异步如果有返回值


1

2

3

4

5

private delegate void invokeDelegate();

del = new invokeDelegate(StartMethod);

var re=   del.BeginInvoke(nullnull);

MessageBox.Show( del.EndInvoke(re));

 MessageBox.Show("f");

这个时候就会堵塞,等待StartMethod执行完才会走到第5句,没有体现出异步的功能。

回调函数可以解决这个问题,可以将EndInvoke放在IAsyncCallback中执行,将3,4句改为


1

IAsyncResult ir = id.BeginInvoke(AddComplete, null);

并添加以下函数:


1

2

3

4

5

prvite void AddComplete(IAsyncResult result)

{

      invokeDelegate handler = (invokeDelegate)((AsyncResult)result).AsyncDelegate;

      MessageBox.Show( handler.EndInvoke(result));

 }

这样就函数便不用等待委托执行完,可以先执行第5句。

StartMethod方法如下:


1

2

3

4

5

private void StartMethod()

{

     Thread.Sleep(5000);

    MessageBox.Show("c");

 }

委托的BeginInvoke实际上是放在threadpool中的。

2.control的invoke和BeginInvoke都是在主线程上的所以它们都会阻塞主线程(control所在线程)。beginInvoke不会阻塞支线程,所以它只能作为支线程的异步

委托的异步,布布扣,bubuko.com

时间: 2024-10-07 07:04:13

委托的异步的相关文章

C#委托的异步调用

#委托的异步调用本文将主要通过"同步调用"."异步调用"."异步回调"三个示例来讲解在用委托执行同一个"加法类"的时候的的区别和利弊.   首先,通过代码定义一个委托和下面三个示例将要调用的方法: /*添加的命名空间using System.Threading;using System.Runtime.Remoting.Messaging;*/    public delegate int AddHandler(int a,i

.NET委托解析(异步委托)

上一篇我们了解到了,委托的基本感念,列举了几个委托的实例,并根据实例来反编译源码查看.NET 委托的内部实现,从浅入深的角度来详细的去解析委托的实质,本文将系上篇继续讨论异步委托的实现以及异步委托的源码解析. 首先本文只会从委托的层面的去编写,不会涉及到深层次的异步.(后续的系列中将会对异步进行深入讲解.敬请关注.). 委托的异步调用方式 在上一篇中我们在实例中是直接通过委托对象的,例如: private static void Main(string[] args)  {        Pro

c# 委托与异步调用

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

C#委托的异步调用1

本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: /*添加的命名空间using System.Threading;using System.Runtime.Remoting.Messaging;*/    public delegate int AddHandler(int a,int b);    public class 加法类    {        public

C# 多线程 用委托实现异步_调用委托的BeginInvoke和EndInvoke方法

1.C#中的每一个委托都内置了BeginInvoke和EndInvoke方法,如果委托的方法列表里只有一个方法,那么这个方法就可以异步执行(不在当前线程里执行,另开辟一个线程执行).委托的BeginInvoke和EndInvoke方法就是为了上述目的而生的. 2.原始线程发起了一个异步线程,有如下三种执行方式: 方式一:等待一直到完成,即原始线程在发起了异步线程以及做了一些必要处理之后,原始线程就中断并等待异步线程结束再继续执行. 方式二:轮询,即原始线程定期检查发起的线程是否完成,如果没有则可

基于委托的异步编程实现

神麽是异步调用 在主线程中异步调用的方法不在主线程中执行,而是在另一个辅助线程中与主线程代码并行执行.给出一段示例代码: 当我们调用UploadPictureAsync方法时,图片尚未上传完成,我们就可以在控制台输出提示信息:"图片开始上传". /// <summary> /// 异步上传图片 /// </summary> /// <param name="fileLocalPath"></param> public

委托的异步执行_demp

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace async_demo{ class Program { static void Main(string[] args) { //委托的异步执行等待结束的四种情况: //1.endinvoke等待执行结束: //2.asyncwaithandle 和第一种差

利用委托实现异步调用

同步调用示例(委托是一个类型安全的,面向对象的指针) using System; using System.Threading; namespace Demo { public delegate int Operate(int x, int y); public class DelegateAsync { static int Add(int a, int b) { Console.WriteLine ("Add() invoked on thread:{0}\n", Thread.C

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

委托 是把一个方法当作一个参数放到声明(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