• C#异步编程のTask模型返回值Task<TResult>应用


    文中所有Task<TResult>的返回值都是直接用task.result获取,这样如果后台任务没有执行完毕的话,主线程会等待其执行完毕,这样的话就和同步一样了(看上去一样,但其实await的时候并不会造成线程的阻塞,web程序感觉不到,但是wpf,winform这样的桌面程序若不使用异步,会造成UI线程的阻塞)。简单演示一下Task回调函数的使用:

    Console.WriteLine("主线程开始");
    Task<string> task = Task<string>.Run(() => {
        Thread.Sleep(2000); 
        return Thread.CurrentThread.ManagedThreadId.ToString(); 
    });
    //会等到任务执行完之后执行
    task.GetAwaiter().OnCompleted(() =>
    {
        Console.WriteLine(task.Result);
    });
    Console.WriteLine("主线程结束");
    Console.Read();
    

     结果:

    OnCompleted中的代码会在任务执行完成之后执行!

    另外task.ContinueWith()也是一个重要的方法:

    Console.WriteLine("主线程开始");
    Task<string> task = Task<string>.Run(() => {
        Thread.Sleep(2000); 
        return Thread.CurrentThread.ManagedThreadId.ToString(); 
    });
    
    task.GetAwaiter().OnCompleted(() =>
    {
        Console.WriteLine(task.Result);
    });
    task.ContinueWith(m=>{Console.WriteLine("第一个任务结束啦!我是第二个任务");});
    Console.WriteLine("主线程结束");
    Console.Read();  

     

    结果:

    ContinueWith()方法可以让该后台线程继续执行新的任务。

  • 相关阅读:
    Tips:数据的单位
    PHP面向对象三大特性③
    PHP面向对象三大特性②
    PHP面向对象三大特性①
    PHP-初识面向对象
    C# 基础·算法篇
    C# 基础·常见面试
    C# 特殊处理使用方法
    C# 第三方组件使用
    JS 插件使用
  • 原文地址:https://www.cnblogs.com/xietianjiao/p/7429861.html
Copyright © 2020-2023  润新知