当前位置: 首页 > 知识库问答 >
问题:

理解基于任务的异步模式C#

贝自怡
2023-03-14

我开始学习C#TAP编码。我不明白为什么代码是同步运行的

    async private void timer1_Tick(object sender, EventArgs e)
    {
        SyncCount++;
        result1.Text = SyncCount.ToString();

        AsyncCount = await CountForALongTimeAsync(AsyncCount);
        result2.Text = AsyncCount.ToString();
    }

    async Task<int> CountForALongTimeAsync(int counter)
    {
        Thread.Sleep(3000);
        counter++;
        return counter;
    }

共有1个答案

景书
2023-03-14
async Task<int> CountForALongTimeAsync(int counter)
{

接下来的将被执行,直到第一个waited异步调用实际执行一些等待(给定的调用可能拥有立即返回所需的一切,例如,可能访问Internet或可能从缓存返回数据的服务,在这种情况下它不会等待)。

根本没有等待的ed调用,因此返回的任务已经完成。

由于调用wait CountForALongTimeAsync是等待返回的任务已经完成,因此它同步运行。

该方法更好,因为:

async Task<int> CountForALongTimeAsync(int counter)
{
    await Task.Delay(3000);
    counter++;
    return counter;
}

顺便说一句,做一些非常(但不完全)相似的事情的前等待方式是:

Task<int> CountForALongTimeAsync(int counter)
{
    return Task.Delay(3000).ContinueWith(t =>
    {
        ++counter;
        return counter;
    });
}

考虑到这些是在任务完成后“继续”的不同想法可能会或可能不会提供一些见解。

相比之下,问题中的代码最接近的预等待方式是:

Task<int> CountForALongTimeAsync(int counter)
{
    Thread.Sleep(3000);
    counter++;
    return Task.FromResult(counter); //FromResult returns an already completed task.
}
 类似资料:
  • 本文向大家介绍c# 基于任务的异步编程模式(TAP)的异常处理,包括了c# 基于任务的异步编程模式(TAP)的异常处理的使用技巧和注意事项,需要的朋友参考一下 在前面讲到了《基于任务的异步编程模式(TAP)》,但是如果调用异步方法,没有等待,那么调用异步方法的线程中使用传统的try/catch块是不能捕获到异步方法中的异常。因为在异步方法执行出现异常之前,已经执行完毕。 1、没有等待的调用异步方法

  • 本文向大家介绍c# 基于任务的异步编程模式(TAP),包括了c# 基于任务的异步编程模式(TAP)的使用技巧和注意事项,需要的朋友参考一下 异步编程是C#5.0的一个重要改进,提供两个关键字:async和await。使用异步编程,方法的调用是在后台运行(通常在线程或任务的帮助下),但不会阻塞调用线程。异步模式分为3种:异步模式、基于事件的异步模式和基于任务的异步模式(TAP)。TAP是利用关键字a

  • 参考DEMO:异步任务处理 异步任务管理器类:EasySwoole\Core\Swoole\Task\TaskManager 在服务启动后的任意一个地方,都可以进行异步任务的投递,为了简化异步任务的投递,框架封装了任务管理器,用于投递同步/异步任务,投递任务有两种方式,一是直接投递闭包,二是投递任务模板类 直接投递闭包 任务比较简单的情况下可以直接投递闭包,任意地方包括控制器/定时器/服务启动后的

  • 本文向大家介绍Android的异步任务AsyncTask详解,包括了Android的异步任务AsyncTask详解的使用技巧和注意事项,需要的朋友参考一下 AsyncTask,顾名思义,异步任务。说到异步,最简单的理解就是不同步。再复杂一点理解,就得举例子了。 假设我要去火车站买票,刚到火车站我突然发现我忘了带身份证。怎么办?怎么办! 想办法,想办法!我想我应该找个在学校的同学帮我送过来,因为我不

  • 本文向大家介绍Django异步任务之Celery的基本使用,包括了Django异步任务之Celery的基本使用的使用技巧和注意事项,需要的朋友参考一下 Celery 许多Django应用需要执行异步任务, 以便不耽误http request的执行. 我们也可以选择许多方法来完成异步任务, 使用Celery是一个比较好的选择, 因为Celery有着大量的社区支持, 能够完美的扩展, 和Django结

  • 我试图了解 Task.Run Wait() 异步等待是如何工作的。 我已经阅读了这个页面:了解在一行中使用Task.Run Wait()异步等待的使用,但不太理解它。 在我的代码中,我从Microsoft EventHub接收事件,并使用实现的类处理它们。我在 () 中调用 方法,这是一个异步方法,这是一个方法。由于该方法是的,因此我使用 和来委派。(即 或< code >。Wait()(该方法是