c# -循环从新线程传入的对象参数
本文关键字:参数 对象 线程 循环 新线程 | 更新日期: 2023-09-27 18:19:09
我正在尝试启动一个新线程并将参数传递给我的一个方法。参数是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;
如果你确实想要启动一个新线程,我将使用第二种方法——保持"脏"本地化到启动一个新线程的方法。这些方法中的任何一种都是可行的。请注意,如果您有多个信息要传递给新线程,那么第二种方法最终会比创建 您必须将 您必须将对象强制转换为它的实际类型,然后您可以使用foreach。 您必须将其强制转换回字符串列表,如下所示: 你也可以这样做: 但是如果strList不是List 为了安全: 用Tuple
并解压缩它更简单。object
类型转换为您的列表类型,例如如下:public void Method(object strList)
{
var list = (List<string>)strList;
foreach ( var s in list )
{
// Do something.
}
}
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;
InvalidCastException
public void Method(object strList)
{
var list = strList as List<string>;
if (list != null)
{
foreach(var item in list )
{
//code here
}
}
}
(List<string>
强制转换对象,然后通过它使用迭代for (int i = 0; i < list.Count; i++) // Loop through List with for
{
Console.WriteLine(list[i]);
}