Передача объекта в поток завершается неудачей - C # - PullRequest
4 голосов
/ 22 ноября 2010

Я пытался передать объект в процесс основного потока, но, похоже, он не будет работать так, как я думал.

Сначала я создаю поток:

Thread thrUDP;

Затем я создаю объект, который буду использовать для хранения необходимых мне данных:

UDPData udpData;

Теперь я инициализирую объект с правильными данными, настраиваю новый поток и начинаю его с объекта, переданного вМетод Start ():

udpData = new UDPData("224.5.6.7", "5000", "0", "2");

            thrUDP = new Thread(new ParameterizedThreadStart(SendStatus));
            thrUDP.Start(udpData);

Это метод, который я хочу запустить:

private void SendStatus(UDPData data)
{
}

Я помню, как использовал Threads некоторое время назад, и я уверен, что они не были такими сложными.чтобы передать данные, я делаю это неправильно или я просто пропускаю фрагмент кода?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 22 ноября 2010

Делегат ParameterizedThreadStart объявлен как:

public delegate void ParameterizedThreadStart(object obj);

Ясно, что этот делегат не совместим с подписью вашего метода, и нет прямого способа получитьSystem.Threading.Thread для работы с произвольным типом делегата.

Один из вариантов - использование совместимой подписи для метода и приведение в соответствующих случаях:

private void SendStatus(object obj)
{
   UDPData data = (UDPData)obj;
   ...
}

Другойвариант будет заключаться в том, чтобы поместить проблему в компилятор C #, создав закрытие.Например:

new Thread(() => SendStatus(udpData)).Start();

Обратите внимание, что вместо этого используется делегат ThreadStart.Кроме того, вы должны быть осторожны с последующим изменением udpData local, так как он захвачен.

В качестве альтернативы, если вы не возражаете против использования пула потоков вместо порождения собственного потока, вы можете использовать асинхронныйделегаты.Например:

Action<UDPData> action = SendStatus;
action.BeginInvoke(udpData, action.EndInvoke, null);
1 голос
/ 22 ноября 2010
private void SendStatus(object data)
{
 UDPData myData = (UDPData) data;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...