gpt4 book ai didi

c# - 创建多个任务,不等待它们,而是让它们按顺序运行

转载 作者:行者123 更新时间:2023-12-02 01:39:35 25 4
gpt4 key购买 nike

我正在尝试让两个任务一个接一个地运行,但我不想等待它们完成,因为我稍后会这样做。最初我使用 ContinueWith 实现,但双重 await 困扰着我,而且我不认为 Unwrap() 是一个显着的改进。

我决定做一个 PoC 来分别创建这 2 个任务,并在我返回 2 个初始任务时调度另一个任务来管理它们,但奇怪的是,一旦我点击等待任务,这些任务就会被标记为已完成。 Delay() 基本上意味着它们实际上是同时运行的。这是代码:

var task1 = new Task(async ()=>
{
Console.WriteLine("Task1 Start");
await Task.Delay(5000);
Console.WriteLine("Task1 STOP");
});
var task2 = new Task(async () =>
{
Console.WriteLine("Task2 Start");
await Task.Delay(5000);
Console.WriteLine("Task2 STOP");
});
var taskParent = Task.Run(async () =>
{
Console.WriteLine("starting 1");
task1.Start();
await task1;
Console.WriteLine("starting 2");
task2.Start();
await task2;
});

Console.WriteLine("BEGIN await parent");
await taskParent;
Console.WriteLine("END await parent");

输出是

BEGIN await parent
starting 1
Task1 Start
starting 2
Task2 Start
END await parent
Task2 STOP
Task1 STOP

因此,我从希望任务 2 在 task1 之后开始,变成了在 task1 之前完成。我看不出调用 await Task.Delay 会将任务标记为完成的原因。我错过了什么吗?

编辑为了简化我的要求,因为似乎有点困惑。任务必须在等待之前返回,并且第二个任务必须在第一个任务之后运行。其他一些线程稍后会想要结果,如果完成正常,否则它将等待。我需要能够等待第二个任务并期望第一个任务在第二个任务之前执行。

最佳答案

任务不是线程。从来没有充分的理由通过其构造函数创建任务并尝试稍后“启动”它。任务是一个 promise ,某件事将在未来完成,甚至可能无法执行。例如,Task.Delay 使用计时器向 TaskCompletionSource 发出信号。

不可能通过Start控制执行,这又是因为任务不是线程。 Start 仅安排执行任务,并不实际运行它。无法保证任务会按照计划的顺序运行。

await 也不执行任务,它等待一个已经处于事件状态的任务完成,而不会阻塞调用线程。您不需要等待任务来执行它。您只需要在想要获取结果时等待它,或者等待它完成。

至于问题本身,目前还不清楚到底是什么问题。如果问题是如何按顺序执行一些异步函数而不等待整个序列,最简单的方法是将它们放入自己的异步方法中,将其任务存储在变量中并在需要时等待它:

async Task GetAnImageAsync()
{
//Load a URL from DB using Dapper
var url=await connection.QueryFirstOrDefault<string>("select top 1 URLs from Pictures");
//Get the image
var image=await client.GetByteArrayAsync(url);
//Save it
await File.WriteAllBytesAsync("blah.jpg",image);
}

...

async Task DoSomethingElse()
{
var imageTask=GetAnImageAsync();
//Do some other work
...
//Only await at the end
await imageTask();
}

关于c# - 创建多个任务,不等待它们,而是让它们按顺序运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71827666/

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