繁体   English   中英

C# - 循环通过从新线程传递的对象参数

[英]C# - Looping through object parameter that was passed from new thread

我正在尝试启动一个新线程并将参数传递给我的一个方法。 参数是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循环?

三种选择:

  • 按原样使用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并解Tuple更简单。

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

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

您必须将对象强制转换为实际类型,然后您才能使用foreach。

使用(List<string> )转换对象,然后使用迭代

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

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

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不是List,则可能抛出InvalidCastException

为了安全起见:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM