首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步/等待单个线程/某些线程

异步/等待单个线程/某些线程
EN

Stack Overflow用户
提问于 2018-04-20 12:01:34
回答 1查看 1.1K关注 0票数 1

我需要一个关于正确使用等待的小规则。在.net核心c# 7.2中运行以下代码:

代码语言:javascript
复制
static class Program
{
    static async Task<string> GetTaskAsync(int timeout)
    {
        Console.WriteLine("Task Thread: " + Thread.CurrentThread.ManagedThreadId);
        await Task.Delay(timeout);
        return timeout.ToString();
    }

    static async Task Main()
    {
        Console.WriteLine("Main Thread: " + Thread.CurrentThread.ManagedThreadId);

        Console.WriteLine("Should be greater than 5000");
        await Watch(NotParallel);
        Console.WriteLine("Should be less than 5000");
        await Watch(Parallel);
    }

    public static async Task Parallel()
    {
        var res1 = GetTaskAsync(2000);
        var res2 = GetTaskAsync(3000);

        Console.WriteLine("result: " + await res1 + await res2);
    }

    public static async Task NotParallel()
    {
        var res1 = await GetTaskAsync(2000);
        var res2 = await GetTaskAsync(3000);

        Console.WriteLine("result: " + res1 + res2);
    }

    private static async Task Watch(Func<Task> func) {
        var sw = new Stopwatch();
        sw.Start();

        await func?.Invoke();

        sw.Stop();
        Console.WriteLine("Elapsed: " + sw.ElapsedMilliseconds);
        Console.WriteLine("---------------");
    }
}

正如大家所看到的,两种方法的行为是不同的。在实践中很容易出错。所以我需要一个“拇指法则”。

更新为真正的男性请运行代码。并解释一下为什么并行()比NonParallel()运行得更快。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-20 22:26:53

在不带GetTaskAsync的情况下调用await时,实际上会得到一个任务,其中包含要执行的方法(即GetTaskAsync)。但是,当调用await GetTaskAsync时,将暂停执行,直到方法执行完毕,然后才会得到结果。

让我说得更清楚一点:

代码语言:javascript
复制
var task = GetTaskAsync(2000);

在这里,任务是Task<string>类型的。

代码语言:javascript
复制
var result = await GetTaskAsync(2000);

这里的结果是string类型的。

因此,要解决你的第一个问题:什么时候等待你的任务真的取决于你的执行流程。

现在,关于为什么Parallel()速度更快的问题,我建议您阅读这个文章 (所有内容都有意义,但对于您的具体示例,您可能会跳转到返回“热”的任务)。

现在让我们把它分解一下:

await关键字用于停止代码,直到任务完成,但实际上并没有启动它。

在您的示例中,NotParallel()将花费更长的时间,因为您的任务依次执行。正如该条所解释的:

这是因为在线等待的任务。

然而在Parallel() ..。

这些任务现在并行运行。这是因为所有任务都是在等待所有任务之前启动的,因为它们返回很热。

关于“热门”任务

我建议您阅读以下内容:基于任务的异步模式(TAP)

“任务状态”一节对理解冷任务和热任务的概念很感兴趣:

由公共任务构造函数创建的任务被称为冷任务,因为它们在非计划创建状态下开始其生命周期,并且只有在这些实例上调用Start时才被调度。 所有其他任务都在热状态下开始其生命周期,这意味着它们所代表的异步操作已经启动。

我邀请您广泛阅读有关async/awaitTasks的内容。除了我上面提供的资源之外,还有以下几个资源:

C# 5.0中的异步编程第二部分:等待什么?

异步/等待-异步编程的最佳实践

异步等待

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49941204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档