gpt4 book ai didi

c# - 使用 LINQ 创建等待任务

转载 作者:太空宇宙 更新时间:2023-11-03 17:30:06 24 4
gpt4 key购买 nike

我想创建一个等待任务的集合,这样我就可以一起启动它们,并在它们完成时异步处理每个任务的结果。

我有这段代码和一个编译错误:

> 无法将 void 分配给隐式类型变量

如果我理解得很好,Select 返回的任务没有返回类型,即使传递的委托(delegate)返回 ColetaIsisViewModel,我会认为:

public MainViewModel()
{
Task.Run(LoadItems);
}

async Task LoadItems()
{
IEnumerable<Task> tasks = Directory.GetDirectories(somePath)
.Select(dir => new Task(() =>
new ItemViewModel(new ItemSerializer().Deserialize(dir))));

foreach (var task in tasks)
{
var result = await task; // <-- here I get the compilation error
DoSomething(result);
}
}

最佳答案

您不应该使用 Task 构造函数。

由于您正在调用同步代码(反序列化),您可以使用Task.Run:

async Task LoadItems()
{
var tasks = Directory.GetDirectories(somePath)
.Select(dir => Task.Run(() =>
new ItemViewModel(new ItemSerializer().Deserialize(dir))));

foreach (var task in tasks)
{
var result = await task;
DoSomething(result);
}
}

或者,您可以使用 Parallel 或 Parallel LINQ:

void LoadItems()
{
var vms = Directory.GetDirectories(somePath)
.AsParallel().Select(dir =>
new ItemViewModel(new ItemSerializer().Deserialize(dir)))
.ToList();

foreach (var vm in vms)
{
DoSomething(vm);
}
}

或者,如果您使 Deserialize 成为真正的 async 方法,那么您可以将其全部设为异步:

async Task LoadItems()
{
var tasks = Directory.GetDirectories(somePath)
.Select(async dir =>
new ItemViewModel(await new ItemSerializer().DeserializeAsync(dir))));

foreach (var task in tasks)
{
var result = await task;
DoSomething(result);
}
}

此外,我建议您不要在构造函数中使用即发即弃。 There are better patterns for asynchronous constructors .

关于c# - 使用 LINQ 创建等待任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45065694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com