.NET中如何在同步代码块中调用异步方法
更新记录
本文迁移自Panda666原博客,原发布时间:2021年7月2日。
在同步代码块中调用异步方法,方法有很多。
一、对于有返回值的Task
在同步代码块中直接访问 Task 的 Result 属性,这会阻塞调用线程直到返回Result为止。
代码实例:
using System;
using System.Threading;
using System.Threading.Tasks;
namespace PandaTestClass
{
class Program
{
private static async Task<(string, string)> DoSomething()
{
//用于返回值
(string, string) result = ("?", "?");
//任务1
await Task.Run(() => {
//模拟耗时任务
for (int i = 0; i <= 100; i += 20)
{
Console.WriteLine($"任务1,当前执行到:{i}%");
Thread.Sleep(TimeSpan.FromSeconds(1));
}
//写入返回值
result.Item1 = "任务1完成";
});
//任务2
await Task.Run(() => {
//模拟耗时任务
for (int i = 0; i <= 100; i += 20)
{
Console.WriteLine($"任务2,当前执行到:{i}%");
Thread.Sleep(TimeSpan.FromSeconds(1));
}
//写入返回值
result.Item2 = "任务2完成";
});
//确保任务执行完成
Task.WaitAll(new Task[] { });
//返回返回值
return result;
}
static void Main(string[] args)
{
//同步块中使用异步方法
//这里会阻塞主线程
(string t1, string t2) result = DoSomething().Result;
//执行完成
Console.WriteLine("DoSomething Success");
//获得结果集1
Console.WriteLine(result.t1);
//获得结果集2
Console.WriteLine(result.t2);
//wait
Console.WriteLine("Main Suceess");
Console.ReadKey();
}
}
}
二、使用Task.Run()方法包裹
强烈推荐该方法。
代码实例:
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace PandaTestClass
{
class Program
{
/// <summary>
/// 异步方法
/// </summary>
/// <returns></returns>
private static async Task<(string, string)> DoSomething()
{
//用于返回值
(string, string) result = ("?", "?");
//任务1
await Task.Run(() => {
//模拟耗时任务
for (int i = 0; i <= 100; i += 20)
{
Console.WriteLine($"任务1,当前执行到:{i}%");
Thread.Sleep(TimeSpan.FromSeconds(1));
}
//写入返回值
result.Item1 = "任务1完成";
});
//任务2
await Task.Run(() => {
//模拟耗时任务
for (int i = 0; i <= 100; i += 20)
{
Console.WriteLine($"任务2,当前执行到:{i}%");
Thread.Sleep(TimeSpan.FromSeconds(1));
}
//写入返回值
result.Item2 = "任务2完成";
});
//确保任务执行完成
Task.WaitAll(new Task[] { });
//返回返回值
return result;
}
static void Main(string[] args)
{
//同步块中使用异步方法
//这里会阻塞主线程
Task<(string t1, string t2)> returnValue = Task.Run(async () => {
(string t1, string t2) r = await DoSomething();
return r;
});
//执行完成
//获得结果集1
Console.WriteLine(returnValue.Result.t1);
//获得结果集2
Console.WriteLine(returnValue.Result.t2);
//wait
Console.WriteLine("Main Suceess");
Console.ReadKey();
}
}
}
.NET中如何在同步代码块中调用异步方法的更多相关文章
- wait、notify为什么要放在同步代码块中
等待方遵循的原则: 获取对象的锁,不满足条件就调用wait()方法,条件满足继续执行 通知方原则: 获取对象的锁,改变条件,然后notify 每个对象都有一个监视器锁,这个监视器锁的数据结构如下: w ...
- java中的synchronized同步代码块和同步方法的区别
下面这两段代码有什么区别? //下列两个方法有什么区别 public synchronized void method1(){} public void method2(){ synchronized ...
- java 为什么wait(),notify(),notifyAll()必须在同步方法/代码块中调用?
在Java中,所有对象都能够被作为"监视器monitor"——指一个拥有一个独占锁,一个入口队列和一个等待队列的实体entity.所有对象的非同步方法都能够在任意时刻被任意线程调用 ...
- [转]java 为什么wait(),notify(),notifyAll()必须在同步方法/代码块中调用?
在 Java中,所有对象都能够被作为"监视器monitor"——指一个拥有一个独占锁,一个入口队列和一个等待队列的实体entity. 所有对象的非同步 方法都能够在任意时刻被任意线 ...
- 【面试普通人VS高手系列】讲一下wait和notify这个为什么要在synchronized代码块中?
一个工作七年的小伙伴,竟然不知道"wait"和"notify"为什么要在Synchronized代码块里面. 好吧,如果屏幕前的你也不知道,请在评论区打上&qu ...
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
- JAVA之旅(十三)——线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this
JAVA之旅(十三)--线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this 我们继续上个篇幅接着讲线程的知识点 一.线程的安全性 当我们开启四个窗口(线程 ...
- 同步方法、同步代码块、volidate变量的使用
当多个线程涉及到共享数据的时候,就会设计到线程安全的问题.非线程安全其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是“脏读”.发生脏读,就是取到的数据已经被其他的线程改过了. ...
- java 同步代码块与同步方法
同步代码块 synchronized (obj) { // 代码块 } obj 为同步监视器,以上代码的含义为:线程开始执行同步代码块(中的代码)之前,必须先获得对同步监视器的锁定. 代码块中的代码是 ...
随机推荐
- 电机三环pid控制及调试经验
一.伺服电机的双环pid 双环pid在正常底盘运动的控制中已经足够了,但是对于双轴云台的控制来说,双环pid的云台控制的响应速度是远远不够的,所以加入了电流环的控制. 两篇大佬的文章--这是我学习pi ...
- xss攻击和防御
简介 XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允 ...
- 理解ASP.NET Core - 授权(Authorization)
注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 之前,我们已经了解了ASP.NET Core中的身份认证,现在,我们来聊一下授权. 老规矩,示 ...
- 05. 树莓派初始配置——开启VNC远程桌面
开启VNC远程桌面 不插显示器就可以看到树莓派系统界面的方式. 1. 如果你下的系统镜像有包含一些基本软件(Raspberry Pi OS with desktop and recommended s ...
- 【python疫情可视化】用pyecharts开发全国疫情动态地图,效果酷炫!
一.效果演示 我用python开发了一个动态疫情地图,首先看下效果: 如图所示,地图根据实时数据通过时间线轮播的方式,动态展示数据的变化.随着时间的推移,疫情确诊数量的增多,地图各个省份颜色逐渐加深, ...
- 公司为什么要使用OKR,目的是什么?
原创不易,求分享.求一键三连 站在公司角度,会有一些诉求: 想知道每个人在干什么,干得怎么样: 想知道如何把更多的人卷起来: 人是不想被管束的,无论是想"度量我"还是想卷我,都是我 ...
- 手脱无名壳tslgame_rl
1.使用Detect It Easy查壳,该壳未显示出壳信息,至于为何有壳,我们使用IDA打开,查看其的导入表,其中没有太多函数使用: 2.我们使用x32dbg打开,运行至入口点,此处没有pushad ...
- 【DIY】【CSAPP-LAB】深入理解计算机系统--datalab笔记
title: 前言 <深入理解计算机系统>一书是入门计算机系统的极好选择,从其第三版的豆瓣评分9.8分可见一斑.该书的起源是卡耐基梅龙大学 计算机系统入门课(Introduction to ...
- JS 异步与 Promise
JS 异步与 Promise 本文写于 2020 年 6 月 8 日 1. 同步与异步与回调函数 Promise 现在是前端面试必考题呀,但是先不急着看 Promise,我们首先来看看什么是异步. - ...
- Vue的vue-router基本使用
一.Vue-router是什么? Vue Router是Vue.js的路由管理器.和Vue.js的核心深度集成,是SPA单页应用的路径管理器,适合用于构建单页面应用.Vue的单页面应用是基于路由和组件 ...