C# 任务是异步的还是没有异步等待的同步的? 如果我有任务没有异步等待,我的任务会考虑异步还是同步?在中,它表示任务异步运行,可以按任何顺序完成。但在其中一个中,它表示任务完成前,等待将同步阻止。因此,当前线程实际上被阻塞,等待任务完成。

C# 任务是异步的还是没有异步等待的同步的? 如果我有任务没有异步等待,我的任务会考虑异步还是同步?在中,它表示任务异步运行,可以按任何顺序完成。但在其中一个中,它表示任务完成前,等待将同步阻止。因此,当前线程实际上被阻塞,等待任务完成。,c#,task-parallel-library,C#,Task Parallel Library,任务是异步的还是没有异步等待的同步的 这完全取决于任务本身,与是否使用wait无关 当您使用Task.Run()创建一个新任务时,它将工作线程排入线程池队列,并将异步运行。但是,您也可以从Task.FromResult()方法中获取Task对象,该方法通常会同步返回已完成的任务 介于这两个极端之间的是async方法,这些方法有时同步完成,有时不同步完成(例如,从文件或网络读取数据,有时数据已经缓冲并可用,有时直到稍后才可用) 与任务的异步性质无关,而是取决于您等待任务完成的方式。当然,同步完成的

任务是异步的还是没有异步等待的同步的

这完全取决于
任务本身,与是否使用
wait
无关

当您使用
Task.Run()
创建一个新任务时,它将工作线程排入线程池队列,并将异步运行。但是,您也可以从
Task.FromResult()
方法中获取
Task
对象,该方法通常会同步返回已完成的任务

介于这两个极端之间的是
async
方法,这些方法有时同步完成,有时不同步完成(例如,从文件或网络读取数据,有时数据已经缓冲并可用,有时直到稍后才可用)

与任务的异步性质无关,而是取决于您等待任务完成的方式。当然,同步完成的任务对象在您有对象引用时已经完成了,所以对这样一个对象的“等待”实际上不会阻止任何事情。因此,有趣的情况是尚未完成的任务对象,即将异步完成的任务对象

在这些情况下,
Wait()
方法将阻止当前线程。这是经过设计的,并且有明确的文档记录。这几乎不是你想要的。但需要注意的是,即使使用
Wait()
,任务本身仍然是异步的。您可能已经阻止了当前线程,但其他事情仍在您的进程中发生,包括任务所代表的内容。这些事情与当前线程是异步发生的

您选择让当前线程什么都不做的事实,不会改变您启动的任务固有的异步性质

更典型的是,您将使用
wait
有效地注册请求,以便在任务完成后,在当前同步上下文中让当前方法恢复执行。在
await
语句中,当前方法将把线程返回给调用方,允许它继续执行其他操作。在这种情况下,任务仍然是异步完成的,就像您使用了
Wait()
并阻塞了线程一样,但现在您的当前线程也有机会执行其他操作

在这两种情况下,任务本身仍然是异步的。你等待它的方式对它没有任何影响


当然,担心任务是否异步也没什么意义。不管怎样,您的代码都应该工作相同。相反,将任务视为在将来某个时候提供结果的“承诺”。事实上,在其他编程环境中,“promise”和“future”这两个词通常用来代替“task”,以表示相同的内容。有时候,这个承诺会立即实现,有时候需要一段时间,但不管发生什么,对你来说都无关紧要。重要的是承诺本身,而不是承诺如何或何时兑现。

SO帖子讨论的是任务上的
Wait()
方法,如果调用它,调用线程将等待执行完成。如果没有,则调用线程将继续(但不要手动调用
Wait()
,您应该始终等待任务)。以下是帮助我理解async/await:1的两个视频。2.但是如果我用wait调用任务,那么任务也会异步运行?@Steve,这是未定义的,完全取决于实现的内容;打电话的人找不到voteI我想我找到了。如果使用
Wait()
调用任务,那么当使用
Wait
(与async组合)调用任务时,任务将同步运行
,然后任务将异步运行
,这取决于“任务异步运行”的含义。正如Marc所说,实际调用的task/async方法与它不知道如何调用的方法运行相同。唯一改变的是调用方的行为。如果使用Wait,编译器会将调用方法转换为异步行为,如果只调用Wait,它不会转换调用方法,调用方法将同步等待。