2011-12-28 7 views
2

新しいスレッドを開始して、自分のメソッドの1つに引数を渡そうとしています。引数はList<string>で、約20個の文字列アイテムが含まれています。私の方法は次のように定義されてC# - 新しいスレッドから渡されたオブジェクトパラメータをループする

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

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

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

私の質問は、私はこの中に含まれる各文字列を通じてforeachループを実行することができる方法である私は、罰金以下のコードを使用して配列を渡すことができますオブジェクト?

+1

ですか?彼らは同じではありません... –

答えて

10

の3つのオプション:

  • 使用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などのより高いレベルの抽象化を使用してください。あなたがやっていることによるが、これは事をもっと簡単にするかもしれない。

あなたはは、新しいスレッドを開始したいん場合は、私は2番目のアプローチを使用したい - 新しいスレッドを起動する方法に局在「汚れ」をキープ。これらのアプローチのいずれかが動作します。新しいスレッドにの情報が複数ある場合は、Tupleを作成して解凍するより簡単な方法になります。

+0

このような強いタイプにするために匿名の方法を使用しています。これは以前は私には一度も起こりませんでした! – diggingforfire

+1

+1ああ、私はその2番目のオプションが好きです。 – albertjan

+1

完璧!私は実際に投稿した直後に最初の方法を見つけ出しましたが、オプション#2を使うことを選択していて、うまくいきます。ありがとう! – Ron

2

objectをリストタイプにタイプキャストする必要があります。次のようになります。

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

オブジェクトを実際の型にキャストする必要があります。foreachを使用するだけです。

0

(List<string>であなたのオブジェクトをキャスト)、その後、あなたがそうのような文字列のリストに戻ってそれをキャストする必要があります、それ

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

彼はそれを最初にキャストする必要があります。これは動作しません。 – albertjan

+0

はい。それはキャストされていないと言いました。 – King

+1

'List 'キャストの周りにティックを置くとコードとして表示されます。 – albertjan

0

繰り返し処理を使用する:あなたがすることもでき

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を投げることができます:この操作を行います一覧

0

安全である:それは文字列配列または `一覧 `

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