C # - цикл по параметру объекта, который был передан из нового потока - PullRequest
2 голосов
/ 29 декабря 2011

Я пытаюсь начать новый поток и передать аргумент одному из моих методов.Аргумент 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 через каждую строку, котораясодержится в этом объекте?

Ответы [ 6 ]

10 голосов
/ 29 декабря 2011

Три варианта:

  • Используйте 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
    }
    
  • Используйте абстракцию более высокого уровня, такую ​​как библиотека параллельных задачили Parallel LINQ вместо этого;в зависимости от того, что вы делаете, это может упростить ситуацию.

Если вы делаете хотите начать новый поток, я бы использовал второй подход -сохраняйте «грязность» локализованной для метода, начиная новую тему.Любой из этих подходов будет работать, хотя.Обратите внимание, что если у вас было более одного фрагмента информации для передачи в новый поток, второй подход оказывается проще, чем создание Tuple и его распаковка.

2 голосов
/ 29 декабря 2011

Вы должны типизировать object к вашему типу списка, например, например:

public void Method(object strList)
{
    var list = (List<string>)strList;
    foreach ( var s in list )
    {
        // Do something.
    }
}
0 голосов
/ 29 декабря 2011

На всякий случай:

public void Method(object strList)
{
   var list = strList as List<string>;
   if (list != null)
    { 
       foreach(var item in list )
       {
          //code here
       }
    }
}
0 голосов
/ 29 декабря 2011

Вам придется привести его обратно к списку строк, например:

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, если strList не является списком

0 голосов
/ 29 декабря 2011

Приведите ваш объект с помощью (List<string>) и затем используйте итерацию для этого

for (int i = 0; i < list.Count; i++) // Loop through List with for
        {
            Console.WriteLine(list[i]);
        }
0 голосов
/ 29 декабря 2011

Вам придется привести объект к его фактическому типу, тогда вы можете просто использовать foreach.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...