0

Всем доброго времени суток.
Поставлена задача написать широковещательный чат на UDP, используя Windows Forms, на C#. Создается глобальный поток:

Thread receiveThread = new Thread(new ThreadStart(ReceiveMessage));

Метод ReceiveMessage - статический:

private static void ReceiveMessage()
    {
        UdpClient receiver = new UdpClient(localPort); // UdpClient для получения данных
        receiver.JoinMulticastGroup(remoteAddress, 20);
        IPEndPoint remoteIp = null;
        string localAddress = LocalIPAddress();
        try
        {
            while (true)
            {
                byte[] data = receiver.Receive(ref remoteIp);
                //if (remoteIp.Address.ToString().Equals(localAddress))
                //    continue;
                string message = Encoding.Unicode.GetString(data);
                MessageBox.Show(message);
            }
        }
        catch (Exception)
        {
        }
        finally
        {
            receiver.Close();
        }
    }

Необходимо, чтобы при получении сообщения оно выводилось в ListBox. К сожалению, на данный момент единственный рабочий вариант - использовать MessageBox, а это совсем не то.
Заранее добавлю, что программа должна работать на .NET Framework 4, а лучше 3.5.
Знаю, что нужно копать в сторону асинхронных потоков, но сам пока не сумел встать на верный путь, поэтому прошу помощи здесь.
Заранее спасибо.

  • хорошо, а в чем вопрос? – tym32167 Oct 02 '18 at 18:19
  • А зачем тут статичный метод? Делайте его обычным, инициализируйте этот класс (если это в отдельном классе) в Form1 (или что там у вас) и через конструктор передавайте ссылку на саму Form1. – EvgeniyZ Oct 02 '18 at 18:20
  • @tym32167 из статического метода, работающего в отдельном потоке, нельзя обратиться к элементам формы – StafordDev Oct 02 '18 at 18:22
  • @EvgeniyZ все реализуется в пределах одного класса Form1 – StafordDev Oct 02 '18 at 18:23
  • Так вопрос тот же, зачем тут статик? – EvgeniyZ Oct 02 '18 at 18:23
  • @EvgeniyZ new ThreadStart(ReceiveMessage) не может обращаться к нестатическому методу – StafordDev Oct 02 '18 at 18:24
  • 1
    очень даже может, если создавать его не в инициализаторе, а. например, в конструкторе – tym32167 Oct 02 '18 at 18:27
  • Хорошо, с методом разобрались. Теперь вопрос с потоками, потому что при попытке что-то записать в listBoxt из метода, работающего в отдельном потоке (ReceiveMessage), выдает exception: "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'listBox1' не из того потока, в котором он был создан." – StafordDev Oct 02 '18 at 18:29
  • А это уже коллега, дубликат. – EvgeniyZ Oct 02 '18 at 18:31
  • @EvgeniyZ Я уже писал ранее: "Знаю, что нужно копать в сторону асинхронных потоков, но сам пока не сумел встать на верный путь". Данную тему видел, но как-то реализовать асинхронность не смог – StafordDev Oct 02 '18 at 18:33
  • При чем тут асинхронность? Берете и пишете listBox1.BeginInvoke.... Читать только верх темы - не есть хорошо... – EvgeniyZ Oct 02 '18 at 18:36
  • @EvgeniyZ Хотите верьте, хотите нет, но я читал всю тему, и дошел до Вашего решения только что (буквально за несколько секунд до Вашего ответа). В любом случае, спасибо, все работает. – StafordDev Oct 02 '18 at 18:37
  • В таком случае, вопрос решен. – StafordDev Oct 02 '18 at 18:40

0 Answers0