栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

C#实现异步编程的方法

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C#实现异步编程的方法

最近在我参与的几个.Net项目中都有用到异步编程,作为一名.Net小白,很有必要好好地学习一下C#异步编程。

什么是异步

异步指的就是不用阻塞当前线程来等待任务的完成,而是将任务扔到线程池中去执行,当前线程可以继续向下执行,直至其它线程将任务完成,并回调通知当前线程。整个任务从开始到结束都是异步完成的,不会阻塞当前线程。因此,异步很重要的一点就是,不会阻塞当前线程。

实现异步编程

在C#语言中,主要是通过委托来实现异步编程的,在委托类型中定义了两个方法BeginInvoke()和EndInvoke()。

/// 
/// 开始执行异步操作.
/// 
/// 委托方法的参数
/// 
/// 
/// 
IAsyncResult BeginInvoke(int param, AsyncCallback callback, Object @object);

/// 
/// 结束执行异步操作,并且返回异步操作结果.
/// 
/// 
/// 委托方法的返回类型
string EndInvoke(IAsyncResult result);

下面就通过一段代码来具体实现异步编程

/// 
/// 定义一个委托类型
/// 
public delegate string Del();

/// 
/// 任务类
/// 
public class TaskClass
{
  public static string SleepTask()
  {
    Console.WriteLine("异步线程(ThreadId = {0})开始执行睡眠任务,睡眠3s.n", Thread.CurrentThread.ManagedThreadId);

    Thread.Sleep(3000);

    Console.WriteLine("异步线程(ThreadId = {0})苏醒,睡眠任务执行结束.n", Thread.CurrentThread.ManagedThreadId);

    return "异步线程执行成功.n";
  }
}
  
/// 
/// 异步编程实现类(主线程不会阻塞)
/// 
public class AsynCallbackClass
{
  public static string result;

  public static void Main(string[] args)
  {
    Console.WriteLine("主线程(ThreadId = {0})开始执行.n", Thread.CurrentThread.ManagedThreadId);

    Del del = new Del(TaskClass.SleepTask);

    Console.WriteLine("主线程(ThreadId = {0})调用BeginInvoke()方法执行异步任务.n", Thread.CurrentThread.ManagedThreadId);

    //开始执行异步操作,TaskClass.SleepTask无参数,Callback为定义的回调方法.
    del.BeginInvoke(Callback, null);

    Console.WriteLine("主线程(ThreadId = {0})继续执行.n", Thread.CurrentThread.ManagedThreadId);

    Thread.Sleep(5000);

    //输出异步任务返回的结果
    Console.WriteLine(result);

    Console.WriteLine("主线程(ThreadId = {0})执行结束.n", Thread.CurrentThread.ManagedThreadId);
  }

  /// 
  /// 回调方法
  /// 
  /// 
  public static void Callback(IAsyncResult ar)
  {
    AsyncResult asyncResult = ar as AsyncResult;

    if (asyncResult == null) { return; }

    Del del = asyncResult.AsyncDelegate as Del;

    if (del == null) { return; }

    Console.WriteLine("回调方法中调用EndInvoke()方法,获取异步任务结果.n", Thread.CurrentThread.ManagedThreadId);
    
    //结束执行异步操作,并返回异步任务结果.
    result = del.EndInvoke(ar);
  }
}

运行结果:

从运行结果中,我们可以发现主线程在调用了BeginInvoke()方法后,没有阻塞,而是继续向下执行,而且任务也确实由一个新的线程来执行,任务执行结束后,调用回调方法,在回调方法中调用EndInvoke()方法来获取任务执行结果。

总结

1. 在异步编程中,当前线程是不会被阻塞的。

2. C#的委托机制可以很方便地实现异步编程。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/123296.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号