我尝试并行运行任务链。我当前的解决方案效率如何

时间:2017-03-09 09:36:31

标签: c# api asynchronous task

我的代码是异步api调用,看起来像下面的示例

public async Task<IEnumerable<TaskObject>> GetTaskObjects()
{
    var tasks = new List<Task<TaskObject>>();
    var shizzle = Task.Run(() => { Thread.Sleep(2000); return new TaskObject("1"); });
    var shizzle2 = Task.Run(() => { Thread.Sleep(1000); return new TaskObject("2"); });

    tasks.Add(shizzle.ContinueWith(part1 => { Thread.Sleep(1000); return part1.Result; }));
    tasks.Add(shizzle2.ContinueWith(part1 => { Thread.Sleep(1000); return part1.Result; }));

    await Task.WhenAll(tasks);
    return tasks.Select(x => x.Result).ToList();
}

控制器是无状态服务光纤Web Api,可以调用有状态服务。这是一个好的解决方案吗?有没有?如果是api调用,是否还需要async和await关键字?

1 个答案:

答案 0 :(得分:2)

public async Task<IEnumerable<TaskObject>> GetTaskObjects2()
{
        var tasks = new List<Task<TaskObject>>();
        var shizzle = Task.Run(() => { Thread.Sleep(2000); return new TaskObject("1"); });
        var shizzle2 = Task.Run(() => { Thread.Sleep(1000); return new TaskObject("2"); });


        //Add your task to the collection
        tasks.Add(shizzle);
        tasks.Add(shizzle2);

        //wait for when all task are finished and it will return the data.
        return await Task.WhenAll(tasks);
    }
  

如果这行代码确实可以等待

/// At this point, all two tasks are running at the same time.
var shizzle = DoShizzleAsync();
var shizzle2 = DoShizzle2Async();

await Task.WhenAll(shizzle2, shizzle);

有关详细信息,请参阅Stephen Cleary blog