问一个很初级的C#多线程问题

J
Jadeson
楼主 (未名空间)

下面的代码是希望每两秒打一次,然后打完十次退出。但是结果似乎一次都没有打。

我后来把await WhenAll换成WaitAll,十次能打出来,但是不能正常退出。

请知道的朋友指点一下。谢谢

public static async void Test(this IContext context)
{
var orders = new List>();
var dt = DateTime.UtcNow;
for (var i = 0; i < 10; ++i)
{
orders.Add(new Tuple(dt.AddSeconds(i * 2 + 2), i));
}

var task = orders.Select(i => new Task(() =>
{
i.Item1.SleepUntil();
Console.WriteLine($"{DateTime.UtcNow}, {i.Item2}, {i.
Item1}");
}
));
foreach (var t in task)
{
t.Start();
}
await Task.WhenAll(task.ToArray());
}
p
pda

orders.Select() statement needs to end with ToList() or ToArray() to
materialize the tasks, like below,

void Main()
{
Test().Wait();
Console.WriteLine($"{DateTime.UtcNow}: Finished all!");
}

// Define other methods and classes here
public static async Task Test()
{
var orders = new List>();
var dt = DateTime.UtcNow;
for (var i = 0; i < 10; ++i)
{
orders.Add(new Tuple(dt.AddSeconds(i * 2 + 2), i));
}

var task = orders.Select(i => new Task(() =>
{
Task.Delay(i.Item1 - DateTime.UtcNow).Wait();
Console.WriteLine($"{DateTime.UtcNow}, {i.Item2}, {i.Item1}");

})).ToList();

foreach (var t in task)
{
t.Start();
}

await Task.WhenAll(task);
}

【 在 Jadeson (紫昂德帅) 的大作中提到: 】
: 下面的代码是希望每两秒打一次,然后打完十次退出。但是结果似乎一次都没有打。: 我后来把await WhenAll换成WaitAll,十次能打出来,但是不能正常退出。
: 请知道的朋友指点一下。谢谢
: public static async void Test(this IContext context)
: {
: var orders = new List>();
: var dt = DateTime.UtcNow;
: for (var i = 0; i < 10; ++i)
: {
: orders.Add(new Tuple(dt.AddSeconds(i * 2 + 2)
: ...................

J
Jadeson

多谢了
h
helpme

哇,这个老ID居然还活着。

【 在 Jadeson (紫昂德帅) 的大作中提到: 】
: 下面的代码是希望每两秒打一次,然后打完十次退出。但是结果似乎一次都没有打。: 我后来把await WhenAll换成WaitAll,十次能打出来,但是不能正常退出。
: 请知道的朋友指点一下。谢谢
: public static async void Test(this IContext context)
: {
: var orders = new List>();
: var dt = DateTime.UtcNow;
: for (var i = 0; i < 10; ++i)
: {
: orders.Add(new Tuple(dt.AddSeconds(i * 2 + 2)
: ...................