C# 异步何时等待更改线程? 当我调用test1()方法时,ManagedThreadId将在 延迟(1) 当我调用test2()方法(而不是test1()时),然后调用ManagedThreadId 将保持不变
异步何时等待更改线程 在test2()方法中,完成该方法所需的时间甚至比在test1()中更长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(
[路由(“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);”方法时,线程会发生变化。@Raskolnikovtest1
实际上调用了一个尚未完成的异步操作,因此它本身将在完成之前返回,这意味着,在等待时,调用方还将返回,然后在当前同步上下文上执行该方法的其余部分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());
}