C# I';我试图并行运行任务链。我当前的解决方案有多高效

C# I';我试图并行运行任务链。我当前的解决方案有多高效,c#,api,asynchronous,task,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

我的代码是一个异步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();
}
public异步任务GetTaskObjects()
{
var tasks=新列表();
var shizzle=Task.Run(()=>{Thread.Sleep(2000);返回新的TaskObject(“1”);});
var shizzle2=Task.Run(()=>{Thread.Sleep(1000);返回新的TaskObject(“2”);});
Add(shizzle.ContinueWith(part1=>{Thread.Sleep(1000);返回part1.Result;}));
Add(shizzle2.ContinueWith(part1=>{Thread.Sleep(1000);返回part1.Result;}));
等待任务。何时(任务);
返回任务。选择(x=>x.Result).ToList();
}
控制器是一个无状态服务光纤Web Api,它对statefull服务进行一些调用。这是一个好的解决方案吗?有更好的吗?如果这是一个api调用,async和Wait关键字是否是必需的

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);
    }

有关更多信息,请参见

好的,那么当使用链接任务时,这是如何工作的呢?为这些函数编写单独的异步函数会更容易吗?@martijn:是的。使用单独的
async
方法和
wait
替换(危险的和低级的)
ContinueWith
。为什么
ContinueWith
被认为是危险的?您几乎不想使用
任务。在服务器上运行
,因为每个请求使用多个线程会很快扼杀您的可伸缩性。
/// At this point, all two tasks are running at the same time.
var shizzle = DoShizzleAsync();
var shizzle2 = DoShizzle2Async();

await Task.WhenAll(shizzle2, shizzle);