C # 4.0, как передавать переменные в потоки? - PullRequest
1 голос
/ 16 апреля 2010

Как бы я передать некоторые параметры в новый поток, который выполняет функцию из другого класса? Я пытаюсь передать массив или несколько переменных в функцию, которая находится в другом классе и вызывается новым потоком.

Я пытался сделать это так>

    Functions functions = new Functions();

    string[] data;

    Thread th = new Thread(new ParameterizedThreadStart(functions.Post()));

    th.Start(data);

но выдает ошибку "Нет перегрузки для метода 'Post' принимает 0 аргументов"

Есть идеи?

Ответы [ 2 ]

9 голосов
/ 16 апреля 2010

Поскольку у вас есть этот помеченный C # 4, новый подход к этому будет:

Functions functions = new Functions();

string[] data = GetData();

Task.Factory.StartNew( () => functions.Post(data) );

Если вы действительно хотите оставить это с помощью выделенного потока, а не библиотеки параллельных задач, вы можете это сделать. Учитывая ваши комментарии, похоже, что Post() определено как Post(string[] data). Это не будет работать, поскольку ParameterizedThreadStart ожидает, что метод будет Post(object data).

Вы можете обойти это через лямбды и, используя ThreadStart вместо ParameterizedThreadStart, однако, без изменения методов:

Functions functions = new Functions();
string[] data = GetData();
Thread th = new Thread( () =>
    {
        functions.Post(data);
    });
th.Start();
2 голосов
/ 16 апреля 2010

Прямой ответ:

 new Thread(new ParameterizedThreadStart(functions.Post/*(remove)*/));

и Functions.Post должны иметь форму:

 void Post(object state) { string[] data = (string[]) state; .... }

Если у вас уже есть фиксированный void Post(string[] data), вы можете добавить обертку к классу функций:

 void Post2(object state) { Post((string[]) state); }

Но при использовании Fx4 вам действительно стоит взглянуть на библиотеку задач.

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