如何解决对于循环异步问题C#
嗨,我正在尝试编写一个简单的代码以异步方式运行我的函数。但是结果却是出乎意料的。我想要的结果就像计数器函数可以并行运行并以类似的方式输出结果:
开始1
End1
Start2
End2
Start3
Start4
结束3
......
嗨
但是事实证明,它只能将for循环值i = 60转换为计数器功能。我对异步方法很陌生,谷歌也找不到合适的解释。
namespace Asycn
{
class Program
{
static async Task Main(string[] args)
{
var tasks = new List<Task>();
for (int i = 0; i < 60; i++)
{
tasks.Add(Task.Run(()=>counters(i)));
}
await Task.WhenAll(tasks);
Console.WriteLine("Hi");
}
private static void counters(int num)
{
Console.WriteLine("Start"+num.ToString());
Thread.Sleep(num*1000);
Console.WriteLine("End"+num.ToString());
}
}
}
下面是运行结果 Running Result
解决方法
我假设您在这里刚刚熟悉异步。通常,当您要处理大量任务时,最好使用plinq或Parallel.Foreach
问题是i
在执行任务之前已递增。
您需要做的就是捕获循环中的值:
namespace Asycn
{
class Program
{
static async Task Main(string[] args)
{
var tasks = new List<Task>();
for (int i = 0; i < 60; i++)
{
var copy = i; // capture state of i
tasks.Add(Task.Run(()=>counters(copy)));
}
await Task.WhenAll(tasks);
Console.WriteLine("Hi");
}
private static void counters(int num)
{
Console.WriteLine("Start"+num.ToString());
Thread.Sleep(num*1000);
Console.WriteLine("End"+num.ToString());
}
}
}
,
您的代码实际上并未充分利用async / await。您并没有捕获i
的值,但是您不必像这样编写代码:
static async Task Main(string[] args)
{
var tasks = new List<Task>();
for (int i = 0; i < 60; i++)
{
tasks.Add(counters(i));
}
await Task.WhenAll(tasks);
Console.WriteLine("Hi");
}
private static async Task counters(int num)
{
Console.WriteLine("Start"+num.ToString());
await Task.Delay(num*1000);
Console.WriteLine("End"+num.ToString());
}
输出看起来像这样:
Start0
End0
Start1
Start2
Start3
...
End1
End2
End3
...
Hi
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。