自动映射器/结构映射与同步代码的 TPL 版本的问题

本文关键字:映射 代码 TPL 版本 问题 同步 结构 | 更新日期: 2023-09-27 18:34:30

这是我的同步工作版本,一些工作人员在给定通用工作负载的情况下可以做一些不同的工作:

foreach (var worker in _workers)
{
    worker.DoWork(workload);
}

我正在尝试通过以下方式通过任务并行库 (TPL( 利用现有内核:

foreach (var worker in _workers)
{
    var worker1 = worker;
    await Task.Run(() => worker1.DoWork(workload));
}
await Task.WhenAll();

目的是,每个工作线程都在自己的线程中执行。请注意,这在异步方法中运行,该方法不时接收"工作负载"。我想确保在再次运行foreach之前完成所有工作。因此,该行:

await Task.WhenAll();  

不幸的是,我似乎有一些与自动映射器/结构映射相关的零星映射异常(它同步工作正常(。这是我的结构图代码:

public class MyRegistry : Registry
{
    public MyRegistry()
    {
        For<ISomething>().Singleton().Use<SomethingConcrete>();
        var profiles =
        from t in typeof(MyRegistry).Assembly.GetTypes()
        where typeof(Profile).IsAssignableFrom(t)
        select (Profile)Activator.CreateInstance(t);
        var config = new MapperConfiguration(cfg =>
        {
        foreach (var profile in profiles)
        {
            cfg.AddProfile(profile);
        }
        });
        For<MapperConfiguration>().Use(config);
        For<IMapper>().Use(ctx => ctx.GetInstance<MapperConfiguration>().CreateMapper(ctx.GetInstance));
    }
}

为了隔离问题,TPL 代码是否存在根本性问题?

自动映射器/结构映射与同步代码的 TPL 版本的问题

TPL 代码是否存在根本性问题?

是的。 await Task.WhenAll() 不执行任何操作,因为它应该接受任务作为参数。卸载到ThreadPool Task.Run但按顺序等待每个任务也不会。

您可能想做的是:

var tasks = new List<Task>();
foreach (var worker in _workers)
{
    tasks.Add(Task.Run(() => worker.DoWork(workload)));
}
await Task.WhenAll(tasks);

或者更简单地说:

await Task.WhenAll(_workers.Select(worker => Task.Run(() => worker .DoWork(workload)));

这将为每个将在ThreadPool上运行的工作线程创建一个任务,然后使用 Task.WhenAll 等待所有这些任务的完成。