委托的BeginInvoke和EndInvoke

刚刚搞明白了C#的异步调用,写下来,方便后续调用。

异步主要是解决UI假死的问题,而开辟出一个新的线程,处理大数据。

1.既然是委托的调用,那么先定义个委托:

public delegate bool CheckUpdateFile();

2.定义一个将要工作的委托函数,和委托类型一致

private bool Press()
        {
            //处理大数据
            //如读取大文件,网络通讯等
            return true;
        }

3.声明及初始化委托实例,运行该实例

BeginInvoke( AsyncCallback callback,object @object) //原型

需要一个带有IAsyncResult 参数类型的函数,如:private void callback(IAsyncResult ar)

CheckUpdateFile fun = new CheckUpdateFile(Press);
fun.BeginInvoke(callback, fun);
//回调函数
private void callback(IAsyncResult ar)//该参数功能强大,万能型,可以传object
        {
            if (!ar.IsCompleted) return;//没有完成,不结束改线程。
            var fun = (CheckUpdateFile)ar.AsyncState;//强类型转换为委托对象
            var isok = fun.EndInvoke(ar);//结束后返回委托Press的结果
            if (isok)
            {
                Invoke((EventHandler)delegate
                {
                  //匿名方法体,委托完成后,将要做什么。
                 });
            }
        }         

二、还可以使用匿名函数来写

var fun = new CheckUpdateFile(Press);
fun.BeginInvoke(ar =>
{
      if (!ar.IsCompleted) return;
      //var fun = (CheckUpdateFile)ar.AsyncState;声明在前部分,不需要转换。
      var isok = fun.EndInvoke(ar);//结束后返回委托Press的结果
      if (isok)
      {
         Invoke((EventHandler)delegate
         {
         });
      }
}, fun);//fun可写为null,匿名函数中不需要转换
时间: 2024-10-22 20:28:48

委托的BeginInvoke和EndInvoke的相关文章

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

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

异步使用委托delegate --- BeginInvoke和EndInvoke方法

当我们定义一个委托的时候,一般语言运行时会自动帮委托定义BeginInvoke 和 EndInvoke两个方法,这两个方法的作用是可以异步调用委托. 方法BeginInvoke有两个参数: AsyncCallBack:回调函数,是一个委托,没有返回值,可以传一个参数,参数类型是object: object AsyncState :回调函数的参数. BeginInvoke的返回值是IAsyncResult, 方法EndInvoke需要的参数是BeginInvoke的返回值IAsyncResult.

C#用委托(Delegate)的BeginInvoke和EndInvoke方法操作线程

C#用委托(Delegate)的BeginInvoke和EndInvoke方法操作线程C# 2011-03-05 13:06:24 阅读19 评论0   字号:大中小 订阅 用委托(Delegate)的BeginInvoke和EndInvoke方法操作线程 在C#中使用线程的方法很多,使用委托的BeginInvoke和EndInvoke方法就是其中之一. BeginInvoke方法可以使用线程异步地执行委托所指向的方法.然后通过EndInvoke方法获得方法的返回值(EndInvoke方法的返回

BeginInvoke和EndInvoke操作和方法

开发语言:C#3.0 IDE:Visual Studio 2008 一.C#线程概述 在操作系统中一个进程至少要包含一个线程,然后,在某些时候需要在同一个进程中同时执行多项任务,或是为了提供程序的性能,将要执行的任务分解成多个子任务执行.这就需要在同一个进程中开启多个线程.我们使用C#编写一个应用程序(控制台或桌面程序都可以),然后运行这个程序,并打开windows任务管理器,这时我们就会看到这个应用程序中所含有的线程数,如下图所示. 如果任务管理器没有“线程数”列,可以[查看]>[选择列]来显

BeginInvoke和EndInvoke方法

IDE:Visual Studio 2008 本系列教程主要包括如下内容: 1. BeginInvoke和EndInvoke方法 2. Thread类 3. 线程池 4. 线程同步基础 5. 死锁 6. 线程同步的7种方法 7. 如何在线程中访问GUI组件 一 线程的概述 在操作系统中一个进程至少要包含一个线程,然后,在某些时候需要在同一个进程中同时执行多项任务,或是为了提供程序的性能,将要执行的任务分解成多个子任务执行.这就需要在同一进程中开启多个线程.我们使用C#编写一个应用程序(控制台或桌

C#线程系列讲座(1):BeginInvoke和EndInvoke方法

  Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 /* Style Definitions */ table.MsoNormalTable { mso-style-parent:""; font-size:10.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";

C#线程 BeginInvoke和EndInvoke使用方法

一.C#线程概述 在操作系统中一个进程至少要包含一个线程,然后,在某些时候需要在同一个进程中同时执行多项任务,或是为了提供程序的性能,将要执行的任务分解成多个子任务执行.这就需要在同一个进程中开启多个线程.我们使用C#编写一个应用程序(控制台或桌面程序都可以),然后运行这个程序,并打开windows任务管理器,这时我们就会看到这个应用程序中所含有的线程数,如下图所示. 如果任务管理器没有“线程数”列,可以[查看]>[选择列]来显示“线程计数”列.从上图可以看出,几乎所有的进程都拥有两个以上的线程

[C#学习笔记之异步编程模式2]BeginInvoke和EndInvoke方法 (转载)

为什么要进行异步回调?众所周知,普通方法运行,是单线程的,如果中途有大型操作(如:读取大文件,大批量操作数据库,网络传输等),都会导致方法阻塞,表现在界面上就是,程序卡或者死掉,界面元素不动了,不响应了.异步方法很好的解决了这些问题,异步执行某个方法,程序立即开辟一个新线程去运行你的方法,主线程包括界面就不会死掉了.异步调用并不是要减少线程的开销, 它的主要目的是让调用方法的主线程不需要同步等待在这个函数调用上, 从而可以让主线程继续执行它下面的代码. BeginInvoke方法可以使用线程异步

c#的BeginInvoke和EndInvoke使用demo

BeginInvoke方法可以使用线程异步地执行委托所指向的方法.然后通过EndInvoke方法获得方法的返回值(EndInvoke方法的返回值就是被调用方法的返回值),或是确定方法已经被成功调用. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace