簡體   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