C# 异步何时等待更改线程? 当我调用test1()方法时,ManagedThreadId将在 延迟(1) 当我调用test2()方法(而不是test1()时),然后调用ManagedThreadId 将保持不变

C# 异步何时等待更改线程? 当我调用test1()方法时,ManagedThreadId将在 延迟(1) 当我调用test2()方法(而不是test1()时),然后调用ManagedThreadId 将保持不变,c#,async-await,C#,Async Await,异步何时等待更改线程 在test2()方法中,完成该方法所需的时间甚至比在test1()中更长 [路由(“api/[控制器]”)] [HttpGet] 公共异步任务Get() { 等待mainsync(); 返回新的ObjectResult(空); } 静态异步任务mainsync() { WriteLine(“主异步:+System.Threading.Thread.CurrentThread.ManagedThreadId.ToString()); 等待test1(); //等待test2(

异步何时等待更改线程

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

[路由(“api/[控制器]”)]
[HttpGet]
公共异步任务Get()
{
等待mainsync();
返回新的ObjectResult(空);
}
静态异步任务mainsync()
{
WriteLine(“主异步:+System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());
等待test1();
//等待test2();
//…更多代码
}
专用静态异步任务test1()
{
Console.WriteLine(“thisIsAsyncStart:+System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());
等待任务。延迟(1);
WriteLine(“thisIsAsyncEnd:+System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());
}
专用静态异步任务test2()
{
Console.WriteLine(“thisIsAsyncStart:+System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());
系统线程线程睡眠(5000);
等待任务。从结果(0);
WriteLine(“thisIsAsyncEnd:+System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());
}

test1
等待
任务。延迟(1)
,它不会在等待它的时候完成,这意味着
test1
的其余部分需要安排为一个连续部分


对于
test2
您正在等待
任务。FromResult
,它将始终返回已完成的
任务。当你等待一个已经完成的任务时,这个方法可以在当前线程上继续运行,而不需要安排继续。

我建议你阅读…的答案,我有一个可以帮助你的方法。假设你把一只鸡放在烤箱里烤,然后在等待的时候付一些账单。把鸡放进烤箱是什么时候让你雇了一个秘书来付账的?没有。异步与多个工作线程无关。这是关于将任务分解成更小的部分,以便您可以及时重新排序。好的。但是为什么在我调用wait test1()时没有创建新线程呢;(或等待test2())?此方法不符合要求,正在等待一段时间。但当我调用wait“Task.Delay(1);”方法时,线程会发生变化。@Raskolnikov
test1
实际上调用了一个尚未完成的异步操作,因此它本身将在完成之前返回,这意味着,在等待时,调用方还将返回,然后在当前同步上下文上执行该方法的其余部分
test2
永远不会等待任何未完成的
任务
实例,因此它最终将同步运行,而不是返回一个不完整的
任务
,这意味着当您
等待它时,它只会同步运行并打开
任务
。我仍在努力解决这个问题。wait test1()之间有什么不同;并等待任务。延迟(1);。两者都是方法,都是静态的,都返回任务。为什么要考虑等待等待的任务呢?Delay(1);但不考虑在等待Test1()上等待;方法test1()是一个长时间运行的过程,与方法任务相同。延迟(1)?@Raskolnikov正如我在回答的开头所说,重要的是返回的
任务是否已经完成。如果已经完成,它将同步继续。换句话说,虽然
async/await
本身不会产生新线程,但等待未完成的
任务将导致任务完成时调用方的执行线程ID发生更改。在我的例子中,我在
async
方法中创建了一个WPF表单对象,但在运行
wait Task.Delay(500)
之后,我突然进入了一个不拥有该对象的新线程,导致
InvalidOperationException
    [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());
    }