我应该实现异步并行或异步任务

时间:2013-06-05 22:48:34

标签: c# task-parallel-library async-await class-library

所有这些代码都位于最低级别的类库中。

对于下面的代码块,我应该将整个代码包裹在Task.Run(()=>{});中,还是有更好的方法来解雇每个.GroupParts?有没有async Parallel会发挥作用?

    public IGroupedParts GroupParts(GroupOption option)
    {
        IGroupedParts gParts = new GroupedParts();

        if (this.Doors.Count > 0) { gParts.Doors = this.Doors.GroupParts(option); }

        if (this.Leafs.Count > 0) { gParts.Leafs = this.Leafs.GroupParts(option); }

        if (this.Sidelites.Count > 0) { gParts.Sidelites = this.Sidelites.GroupParts(option); }

        if (this.Glass.Count > 0) { gParts.Glass = this.Glass.GroupParts(option); }

        if (this.GlassStops.Count > 0) { gParts.GlassStops = this.GlassStops.GroupParts(option); }

        if (this.Horizontals.Count > 0) { gParts.Horizontals =this.Horizontals.GroupParts(option); }

        if (this.Verticals.Count > 0) { gParts.Verticals = this.Verticals.GroupParts(option); }

        if (this.Sills.Count > 0) { gParts.Sills = this.Sills.GroupParts(option); }

        if (this.Midrails.Count > 0) { gParts.Midrails = this.Midrails.GroupParts(option); }

 ...///still more code but omitted

        return gParts;
    }

---当我说用Task.Run(()=>{});

包裹整个代码时,这是我正在讨论的一个例子
public async Task<IGroupedParts> GroupParts(GroupOption option)
        {
            return await Task.Run(() =>
                {
                    IGroupedParts gParts = new GroupedParts();

                    if (this.Doors.Count > 0) { gParts.Doors = this.Doors.GroupParts(option); }

                    if (this.Leafs.Count > 0) { gParts.Leafs = this.Leafs.GroupParts(option); }

                    if (this.Sidelites.Count > 0) { gParts.Sidelites = this.Sidelites.GroupParts(option); }

                    return gParts;
                });
        }

---我没有并行示例,这就是我寻求帮助的原因......

1 个答案:

答案 0 :(得分:0)

你目前包装整个操作的方式对我来说似乎很好。但是,目前尚不清楚您是否在询问方法论,因为这需要花费大量时间,或者您是否在询问您目前正在做什么。

如果性能有问题,您可以使用Task.Factory.StartNew / Task.Run在其各自的线程池线程上旋转每个单独的操作,但根据机器架构,这可能无法提供速度永远都是如此。

您目前拥有的内容不应该锁定用户界面,如果您的表现合理,我不会发现除了重新命名您的异步方法以外,还没有真正需要优化您正在做的事情。 1}}后缀[漂亮的小东西]

Async

我希望这会有所帮助。