C# I';我试图并行运行任务链。我当前的解决方案有多高效
我的代码是一个异步api调用,如下例所示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
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);