gpt4 book ai didi

c# - Task.Delay 与 Thread.Sleep 的区别

转载 作者:行者123 更新时间:2023-12-03 12:44:04 25 4
gpt4 key购买 nike

private static async Task MainFunc()
{
var watch = System.Diagnostics.Stopwatch.StartNew();

List<Task<int>> list = new List<Task<int>>();

for (int i = 1; i <= 3; i++)
{
list.Add(TaskFunc(i));
}

var taskResult = await Task.WhenAll(list);

foreach (var item in taskResult)
{
Console.Write($"i= {item}.{ Environment.NewLine }");
}

list.Clear();

watch.Stop();
var elapsedMs1 = watch.ElapsedMilliseconds;

Console.WriteLine($"Total execution time: { elapsedMs1 }");
Console.WriteLine();


watch.Restart();


for (int i = 1; i <= 3; i++)
{
list.Add(Task.Run(() => ThreadFunc(i)));
}

var threadResult = await Task.WhenAll(list);

foreach (var item in threadResult)
{
Console.Write($"i= {item}.{ Environment.NewLine }");
}

watch.Stop();
var elapsedMs2 = watch.ElapsedMilliseconds;

Console.WriteLine($"Total execution time: { elapsedMs2 }");
}

private static async Task<int> TaskFunc(int i)
{

if (i == 1)
await Task.Delay(2000);
else if (i == 2)
await Task.Delay(1000);
else if (i == 3)
await Task.Delay(5000);

return i;
}

private static int ThreadFunc(int i)
{
if (i == 1)
Thread.Sleep(2000);
else if (i == 2)
Thread.Sleep(1000);
else if (i == 3)
Thread.Sleep(5000);

return i;
}


在这个例子中有两个函数, TaskFuncThreadFunc ,从 MainFunc 调用分开。我很好奇为什么第二种方法似乎没有任何效果,并且似乎被跳过了。甚至没有 Thread.Sleep(...)似乎被执行。

Time comparison

如您所见, ThreadFunc 的总执行时间非常短,即使两种方法的 sleep 计时器应该相同。另外, i总是设置为 4。我想主线程做错了什么。有人可以解释这里发生了什么吗?

最佳答案

这里的问题是范围界定。 i您在 Task.Run(() => TheadFunc(i)) 内使用不是一个新的整数,而是因为它是一个委托(delegate),i 的值只有在执行委托(delegate)后才会检索。

这导致 i在所有情况下都是 4,因为您的 for -loop 增加了很多。但是由于您没有 if - 值为 4 的条件,它不会使用 Thread.Sleep(...) 执行任何延迟.

关于c# - Task.Delay 与 Thread.Sleep 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60915409/

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