相关疑难解决方法(0)

如果async-await没有创建任何其他线程,那么它如何使应用程序响应?

一次又一次,我看到它说使用async- await不会创建任何额外的线程.这没有任何意义,因为计算机一次看起来只做一件事以上的唯一方法就是

  • 实际上一次做多件事(并行执行,使用多个处理器)
  • 通过调度任务并在它们之间切换来模拟它(做一点A,一点点B,一点A,等等)

因此,如果async- await这些都没有,那么它如何使应用程序响应?如果只有一个线程,则调用任何方法意味着在执行任何其他操作之前等待方法完成,并且该方法中的方法必须在继续之前等待结果,依此类推.

.net c# multithreading asynchronous async-await

220
推荐指数
8
解决办法
5万
查看次数

异步等待和线程

我正在async-await和任务一起工作,但我无法理解一件事:

异步任务是在单独的线程中执行的吗?

正如msdn所说(异步编程):

async和await关键字不会导致创建其他线程.异步方法不需要多线程,因为异步方法不能在自己的线程上运行.

但是在ThreadPool类(ThreadPool类)的描述中的注释:

使用线程池线程的操作示例包括:

当您创建Task或Task对象以异步执行某些任务时,默认情况下,该任务计划在线程池线程上运行.

所以,现在我不明白async任务是否使用单独的线程.请解释一下.谢谢.

.net c# multithreading threadpool async-await

6
推荐指数
3
解决办法
1万
查看次数

当async-await改变线程?

  • 当我调用test1()方法时,ManagedThreadId将在Delay(1)之后更改.
  • 当我调用test2()方法(而不是test1())时,ManagedThreadId将保持不变.

当async-await改变线程?

在test2()方法中,完成方法所需的时间甚至比test1()更长

    [Route("api/[controller]")]
    [HttpGet]
    public async Task<IActionResult> Get()
    {
        await MainAsync();
        return new ObjectResult(null);
    }

    static async Task MainAsync()
    {
        Console.WriteLine("Main Async: " + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());
        await test1();
        //await test2();
        // . . .more code
    }

    private static async Task test1()
    {
        Console.WriteLine("thisIsAsyncStart: " + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());
        await Task.Delay(1);
        Console.WriteLine("thisIsAsyncEnd: " + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());
    }

    private static async Task test2()
    {
        Console.WriteLine("thisIsAsyncStart: " + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());
        System.Threading.Thread.Sleep(5000);
        await Task.FromResult(0);
        Console.WriteLine("thisIsAsyncEnd: " + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());
    }
Run Code Online (Sandbox Code Playgroud)

c# async-await

0
推荐指数
1
解决办法
577
查看次数