【问题标题】:Increase a value for each iterate of for loop then assign to each thread [duplicate]为for循环的每次迭代增加一个值,然后分配给每个线程[重复]
【发布时间】:2021-10-29 20:51:28
【问题描述】:

程序.cs:

class Program
{
    static void Main()
    {
        Class1 c1 = new Class1();
        for(int i=0;i<2;i++)
        {
            Thread t = new Thread(() =>
              {
                  c1.pr(i);
              });
            t.Start();
        }
    }

}

Class1.cs:

public class Class1
    {
        public void pr(int i)
        {
           Console.WriteLine((i).ToString());
        }
    }

结果: 2 2

我希望结果为 0 1。对于每个线程,将 i 的值分配给函数 'pr'。

如果我在t.Start() 之后添加t.Join(),它就可以工作。但是加入的线程必须等到其他线程完成工作,有没有不使用 Join() 函数提供相同结果的解决方案?我想同时执行它们

【问题讨论】:

标签: c# multithreading


【解决方案1】:

您当前(可能在不知不觉中)所做的是为每次迭代创建一个线程,这没有什么意义。你应该这样做:

将 for 循环放在 lambda 函数中。

    Thread t = new Thread(() =>
    {
        for(int i=0;i<2;i++)
        {
            c1.pr(i);
        }
    });
    t.Start();

然后您可以根据需要创建任意数量的线程,它们都会打印自己的循环变量迭代。

小切线: 有趣的是,在您的示例中打印两次 '2' 的原因并不直观,并且是 lambda 函数的一个已知“问题”,因为它们仅捕获闭包的值。如果您对该主题感兴趣,请查看此question

【讨论】:

  • 没问题。如果人们对您的问题投反对票,请不要气馁。 StackOverflow 的人们试图提供帮助,但期望以非常特定的格式提供内容。因为这有助于我们帮助您。祝你好运!
  • 我很想知道你想用“问题”周围的双引号表达什么意思?
  • @Enigmativity 好吧,AFAIK 这本身并不是一个真正的问题,相反,据我了解,这是在迭代时捕获变量值的结果。我试图传达这不是一个错误,它不会被修复,但它可能会给那些不知道的人带来问题。
  • 很好的解释。我喜欢它。
猜你喜欢
  • 2017-02-09
  • 2012-05-19
  • 1970-01-01
  • 2018-06-13
  • 2021-02-02
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多