我一直在考虑C#5中新的异步内容,并提出了一个特别的问题.
我知道await关键字是一个简洁的编译器技巧/语法糖来实现连续传递,其中方法的其余部分被分解为Task对象并排队以按顺序运行,但是控制返回到调用方法.
我的问题是,我听说目前这一切都在一个线程上.这是否意味着这种异步内容实际上只是将连续代码转换为Task对象然后Application.DoEvents()在每个任务完成之后调用,然后再开始下一个任务?
或者我错过了什么?(问题的这一部分是修辞 - 我完全清楚我错过了什么 :))
我一直在阅读很多关于异步和等待的内容,起初我没有得到它,因为我没有正确理解线程或任务.但在掌握了两者之后,我想知道:async/await如果你对线程感到满意,为什么要使用?
异步/等待的异步可以通过线程信令Thread.Join()等完成.它仅仅是为了节省编码时间和"少"麻烦吗?
我只是想知道是否有人可以指出我关于async/await框架和线程池的正确方向?
基本上,我正在尝试做的是在单独的线程/异步中执行x个操作,但是最多y个线程.
例如,假设我有100个数据库操作:
await _repository.WriteData(someData);
我想要做的是有一些方法一次运行10个这样的操作(理想情况是每个单独的线程,所以10个线程),并且每个完成后,下一个在线程上启动变得可用了.然后我们等待所有操作完成并完成所有线程......
这是否可以轻松实现而无需太多努力或增加大量复杂性?
我们需要在我们的代码中写一些日志。
日志是通过记录一些信息的网络请求写入的(记录器是一个 Http-API 模块),但是如果 API 中有异常,我们不想中断整个流程。
我不Task.Run用于这种操作,因为它很糟糕。
但后来我想到了 non-awaitable-inline-function ,像这样:
private static readonly HttpClient client = new HttpClient();
void Main()
{
Console.WriteLine(1);
async Task LogMe()
{
var response = await client.PostAsync("http://www.NOTEXISTS.com/recepticle.aspx", null);
var responseString = await response.Content.ReadAsStringAsync();
//response.EnsureSuccessStatusCode(); // I don't need this here
Console.WriteLine("error");
}
//some code
LogMe();
//some code
Console.WriteLine(3);
}
Run Code Online (Sandbox Code Playgroud)
输出:
1
2
Run Code Online (Sandbox Code Playgroud)
题:
它是登录“即发即忘”模式的可行解决方案吗?
如果我在这个内联方法中创建对象,它们什么时候会被 GC 处理呢?