c# – 在.NET中是否保持异步调用的顺序?用异步等待实现Logger?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 在.NET中是否保持异步调用的顺序?用异步等待实现Logger?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1832字,纯文字阅读大概需要3分钟。
内容图文
我正在尝试创建一个简单的异步记录器.使日志记录调用非阻塞和尽可能不引人注目的想法.请考虑以下简化代码 –
class Logger {
public async void Log(string message) {
LogTable log = new LogTable(); //LogTable is an SqlServer table
log.Timestamp = DateTime.Now;
log.Message = message;
log.SomeProp = SomeVariableTimeCalculation();
var db = new Entities(); //db is an EF6 context
db.Entry(log).State = EntityState.Added;
db.LogTables.Add(log);
await db.SaveChangesAsync();
}
}
可以按如下方式使用它(不等待任何Log(…)调用) –
class Account
private readonly Logger logger = new Logger();
public void CreateAccount(Account acc) {
logger.Log("CreateAccount Start");
//Maybe some async operations here
logger.Log("CreateAccount Validation Start");
bool isValid = Validate(acc);
logger.Log("CreateAccount Validation End");
if(isValid) {
logger.Log("CreateAccount Save Start");
acc.Save();
logger.Log("CreateAccount Save End");
}
else {
logger.Log("Account validation failed");
}
logger.Log("CreateAccount End");
}
}
我的问题是 –
>一个接一个地有多个异步Log(…)调用.编译器是否可以选择同时并行运行所有它们?如果是,编译器是否知道维护这些调用的顺序以便logger.Log(“CreateAccount Validation Start”);在logger.Log之前没有结束运行(“CreateAccount Start”);?
>如果编译器没有保留顺序,那么除了在Logger类中维护队列之外,还有其他办法吗?
更新:澄清 – 我主要担心的是避免竞争条件,例如,导致logger.Log(“CreateAccount Validation Start”);在logger.Log之前运行/完成(“CreateAccount Start”);并在不阻止CreateAccount的情况下调用Log.
解决方法:
Can the compiler potentially choose to run all them in parallel simultaneously?
不.异步与并行完全不同.
If the compiler doesn’t preserve order, then is there a way around it other than maintaining a queue within the Logger class?
编译器确实保留了顺序(即,await用于顺序异步代码).但是,队列仍然不是一个坏主意,因为您可能不希望在每次日志记录调用时都访问实际数据库.
内容总结
以上是互联网集市为您收集整理的c# – 在.NET中是否保持异步调用的顺序?用异步等待实现Logger?全部内容,希望文章能够帮你解决c# – 在.NET中是否保持异步调用的顺序?用异步等待实现Logger?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。