• 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()方法可以让该后台线程继续执行新的任务。

  • 相关阅读:
    云钉一体应用创新:音视频如何带来灵活高效的协同体验
    正则表达式,去除非数字。js动态计算
    使用DbContext实体类访问数据库
    C#字符串去除特殊字符
    实体类赋值给控件,控件赋值给实体类
    List去除重复项。
    分页查询的sql语句
    js页面处理常见问题
    .net Table 导出Excel
    上传文件。普通和ftp
  • 原文地址:https://www.cnblogs.com/xietianjiao/p/7429861.html
Copyright © 2020-2023  润新知