【问题标题】:C# - Looping through object parameter that was passed from new threadC# - 循环通过从新线程传递的对象参数
【发布时间】:2012-01-29 11:10:52
【问题描述】:

我正在尝试启动一个新线程并将参数传递给我的一个方法。参数是List<string>,包含大约 20 个字符串项。我可以使用以下代码很好地传递数组:

List<string> strList = new List<string>();

Thread newThread = new Thread(new ParameterizedThreadStart(Class.Method));
newThread.Start(strList);

我的方法定义为:

public void Method(object strList)
{
//code
}

那么我的问题是如何在这个对象中包含的每个字符串中运行一个 foreach 循环?

【问题讨论】:

  • 是字符串数组还是List&lt;string&gt;?他们不一样...

标签: c# multithreading object foreach


【解决方案1】:

三个选项:

  • 照原样使用ParameterizedThreadStart,并在方法中进行转换:

    public void Method(object strList)
    {
        List<string> list = (List<string>) strList;
        // Use list here
    }
    
  • 使用匿名函数以强类型的方式捕获变量,并从匿名函数中调用强类型的方法:

    List<string> strList = new List<string>();
    ThreadStart action = () => Method(strList);
    new Thread(action).Start();
    
    ...
    
    public void Method(List<string> list)
    {
        // Use list here
    }
    
  • 改为使用更高级别的抽象,例如任务并行库或并行 LINQ;取决于你在做什么,这可能会让事情变得更简单。

如果您确实想要启动一个新线程,我会使用第二种方法 - 将“脏”保持在启动新线程的方法上。不过,这些方法中的任何一种都可以。请注意,如果您有多个信息要传递给新线程,则第二种方法最终会比创建Tuple 并解压缩它更简单。

【讨论】:

  • 使用匿名方法来强类型这样..这很整洁,我以前从未想过!
  • 完美!实际上,我在发布后不久就想出了第一种方法,但我选择使用选项#2,它效果很好。谢谢!
  • 只是稍微扩展一下,因为我很好奇。有没有办法使用 strList.Count 获取计数并为列表中的每个项目创建一个新线程?
  • @Ron:这就是 Parallel LINQ 发挥作用的地方 - Parallel.ForEach。
  • 好的,我以后可能会考虑这个,因为我必须升级我的软件。谢谢
【解决方案2】:

您必须将object 类型转换为您的列表类型,例如以下:

public void Method(object strList)
{
    var list = (List<string>)strList;
    foreach ( var s in list )
    {
        // Do something.
    }
}

【讨论】:

    【解决方案3】:

    您必须将对象转换为它的实际类型,然后您可以使用 foreach。

    【讨论】:

      【解决方案4】:

      您必须将其转换回字符串列表,如下所示:

      public void Method(object strList)
      {
          List<string> internalStringList = strList as List<string>;
          //this is a save cast the "internalStringList" variable will 
          //be null if the cast fails.
      }
      

      您也可以这样做:

      List<string> internalStringList = (List<string>) strList;
      

      但如果 strList 不是列表,这可能会引发 InvalidCastException

      【讨论】:

        【解决方案5】:

        为了安全起见:

        public void Method(object strList)
        {
           var list = strList as List<string>;
           if (list != null)
            { 
               foreach(var item in list )
               {
                  //code here
               }
            }
        }
        

        【讨论】:

          【解决方案6】:

          使用(List&lt;string&gt;) 投射您的对象,然后通过它使用迭代

          for (int i = 0; i < list.Count; i++) // Loop through List with for
                  {
                      Console.WriteLine(list[i]);
                  }
          

          【讨论】:

          • 你应该在List&lt;string&gt;演员周围打勾,然后它会显示为代码。
          猜你喜欢
          • 2017-03-06
          • 2012-07-05
          • 1970-01-01
          • 2023-03-25
          • 1970-01-01
          • 1970-01-01
          • 2017-07-18
          • 2021-05-09
          • 1970-01-01
          相关资源
          最近更新 更多