C#中的异步方法不是异步的吗?
发布时间:2020-12-15 08:44:57 所属栏目:百科 来源:网络整理
导读:创建了以下控制台应用程序后,我有点困惑为什么它似乎同步运行而不是异步运行: class Program{ static void Main(string[] args) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); var total = CreateMultipleTasks(); stopwatch.Stop(); Conso
创建了以下控制台应用程序后,我有点困惑为什么它似乎同步运行而不是异步运行:
class Program { static void Main(string[] args) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); var total = CreateMultipleTasks(); stopwatch.Stop(); Console.WriteLine("Total jobs done: {0} ms",total.Result); Console.WriteLine("Jobs done in: {0} ms",stopwatch.ElapsedMilliseconds); } static async Task<int> CreateMultipleTasks() { var task1 = WaitForMeAsync(5000); var task2 = WaitForMeAsync(3000); var task3 = WaitForMeAsync(4000); var val1 = await task1; var val2 = await task2; var val3 = await task3; return val1 + val2 + val3; } static Task<int> WaitForMeAsync(int ms) { Thread.Sleep(ms); return Task.FromResult(ms); } } 运行应用程序时,输出为:
我原以为是会像以下一样:
这是因为当我使用Thread.Sleep方法时它会停止进一步执行整个应用程序吗?或者我错过了一些重要的东西? 解决方法
您以同步方式运行任务.你可以这样做:
static async Task<int> CreateMultipleTasks() { var task1 = Task.Run<int>(() => WaitForMeAsync(5000)); var task2 = Task.Run<int>(() => WaitForMeAsync(3000)); var task3 = Task.Run<int>(() => WaitForMeAsync(4000)); Task.WaitAll(new Task[] { task1,task2,task3 }); return task1.Result + task2.Result + taks3.Result; } 连续使用三个await将不会并行运行任务.它将在等待时释放线程(如果你使用等待Task.Delay(ms),因为Thread.Sleep(ms)是一个阻塞操作),但当task1处于“休眠”时,当前执行将不会继续task2. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- 详解vue-resource promise兼容性问题
- ruby-on-rails – 如何使用Mechanize或Faraday在
- objective-c – 如何从另一个视图控制器访问变量
- debian – 如何在没有太多延迟的情况下配置rsysl
- ORACLE 11G R2 RAC+Mutilpath+RAW+ASM+Silent+Ad
- 如何在Swift中与ABPeoplePickerNavigationContro
- cocos2dx button的使用以及cocostudio/ObjectFac
- sqlite数据库处理时间问题 和 日期时间函数
- String.split()与StringUtils.split()
- [cocos2dx_Lua]打印用户数据
热点阅读