【发布时间】:2018-11-07 18:41:12
【问题描述】:
总是设法让自己与异步工作混淆,我在这里进行了一些验证/确认,我正在做我认为我在以下情况下正在做的事情..
举个简单的例子:
// pretend / assume these are json msgs or something ;)
var strEvents = new List<string> { "event1", "event2", "event3" };
我可以将每个事件发布到 eventthub,如下所示:
foreach (var e in strEvents)
{
// Do some things
outEventHub.Add(e); // ICollector
}
foreach 将在单个线程上运行,并按顺序执行其中的每一件事。我猜到 eventthub 的发布也将保持在同一个线程上??
将 ICollector 改为 IAsyncCollector,实现以下效果:
foreach (var e in strEvents)
{
// Do some things
await outEventHub.AddAsync(e);
}
我想我是说 foreach 将在单个线程上运行,实际发送到事件中心将被推迟到其他地方?或者至少不阻塞同一个线程..
更改为 Parallel.ForEach 事件,因为这些事件一次将到达 100 多个左右:
Parallel.ForEach(events, async (e) =>
{
// Do some things
await outEventHub.AddAsync(e);
});
现在开始有点朦胧,因为我不确定 真正 现在正在发生什么...... afaik 每个事件都有它自己的线程(在硬件范围内)和步骤在那个线程中不要阻塞它。所以这个简单的例子放在一边。
最后,我可以将它们全部转为我认为的任务..
private static async Task DoThingAsync(string e, IAsyncCollector<string> outEventHub)
{
await outEventHub.AddAsync(e);
}
var t = new List<Task>();
foreach (var e in strEvents)
{
t.Add(DoThingAsync(e, outEventHub));
}
await Task.WhenAll(t);
现在我真的很迷茫,我认为这是在单个线程上准备所有内容..然后在任何可用线程上同时运行所有内容??
我很感激为了确定哪个适合手头的工作,需要进行基准测试...但是现在解释框架在每种情况下所做的工作对我来说非常有帮助..
【问题讨论】:
-
有点离题但是,假设我们在这里谈论的是 azure 事件中心,我建议你捆绑事件和 send events in a batch
-
这不是太离题@PeterBons,但是是的,这是一个好主意,而且我们真的做的还不够多。我一定会考虑的 :)
标签: c# multithreading async-await