【发布时间】:2018-06-04 22:21:00
【问题描述】:
我有一个 Web 服务器,并且有定期的作业合并和发送记录(大量请求日志)。
Task.Run(() =>
{
while (true)
{
try
{
MergeAndPutRecords();
}
catch (Exception ex)
{
Logger.Error(ex);
}
}
});
MergeAndPutRecords函数中有代码合并记录,async函数返回Task发送记录。 (实际上是 Amazon Kinesis Firehose 的 PutRecordBatchAsync。)
如果我在没有 await 关键字的情况下调用该函数会发生什么?函数是否在单独的线程上运行? Here says it is not。那么什么是返回任务手段? Here 表示没有 await 关键字的异步方法意味着
- 在当前线程上启动异步方法。忽略所有结果(包括例外)。
那么我的定期作业和 PutRecordBatchAsync 是同时处理的吗?我知道异步和并发是不同的。但是没有 await 关键字,它们在同一个线程中。哪个会先被执行?我很困惑……
会有大量记录需要实时合并和发送。所以我认为它必须同时执行..
【问题讨论】:
-
async关键字本身不会做任何事情。每个await组合成一个AsyncStateMachine,可以异步处理内容。如果async方法中没有await关键字,则没有理由创建AsyncStateMachine,因此您将获得同步方法。 -
await用于等待结果到达。它不以任何方式控制获得结果的过程是如何开始或正在进行的获得结果的过程是如何工作的。
标签: c# asynchronous async-await