gpt4 book ai didi

c# - 具有同步方法调用的异步任务

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

我开始使用新的 .net 4.5 异步编程,我发现了类似下面代码的情况:我有一个同步方法,但我想进行多次调用并使其并行运行。但是,在这段代码中,所有对 sync 方法的调用都以 id = 10 运行,我不确定为什么(可能我对这种新方法有误解:)。

class Program
{
static void Main(string[] args)
{
var tasks = new List<Task>();

for (int i = 0; i < 10; i++)
{
var foo = new Foo();
var fooTask = Task.Run(() => foo.FooNonAsyncMethod(i));
tasks.Add(fooTask);
}
tasks.ForEach(t => t.Wait());

Console.WriteLine("All Done!");

Console.ReadLine();
}
}

public class Foo
{
public void FooNonAsyncMethod(int id)
{
Console.WriteLine("Starting {0}", id);

Thread.Sleep(4000);

Console.WriteLine("Ending {0}", id);
}
}

// Output:

// Starting 10
// Starting 10
// Starting 10
// Starting 10
// Ending 10
// Starting 10
// Starting 10
// Ending 10
// Ending 10
// ...

最佳答案

那是因为只有 1 个变量 i 并且 lambda 表达式绑定(bind)在变量上而不是值上。

您可以使用以下方法解决此问题:

for (int i = 0; i < 10; i++)
{
int newI = i;
var foo = new Foo();
var fooTask = Task.Run(() => foo.FooNonAsyncMethod(newI));
tasks.Add(fooTask);
}

正如@Yuriy 提到的,这个答案有更多关于这个特殊性的信息:Is there a reason for C#'s reuse of the variable in a foreach?

关于c# - 具有同步方法调用的异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25548253/

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