Member 14833590 Ответов: 1

Почему task.factory.startnew блокирует поток пользовательского интерфейса?


Я сделал асинхронную версию клиент-серверного приложения на языке c#. Все работает нормально, сообщения идут в обе стороны, но когда он входит в поле зрения, поток пользовательского интерфейса блокируется и ничего не делает. У кого-нибудь есть идея?
Это мой клиентский код :
using System;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Threading.Tasks;
using client.ObjectHandler;
using core;

namespace client.ConnectionHandler
{
    public class Connection
    {
        private static Socket serverSocket;
        private BaseHandler baseHandler;
        public Connection(BaseHandler baseHandler)
        {
            this.baseHandler = baseHandler;
            IPHostEntry host = Dns.GetHostEntry("localhost");
            IPAddress ipAddress = host.AddressList.First();
            IPEndPoint serverEndpoint = new IPEndPoint(ipAddress, 9000);

            if (serverSocket == null)
            {
                serverSocket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                serverSocket.Connect(serverEndpoint);
                Console.WriteLine($"Successfully connected to server on: {serverSocket.RemoteEndPoint}");
            }
            Task.Factory.StartNew(() => receiveMessage());
        }

        public void receiveMessage()
        {
            Message receivedMessage = null;
            var buffer = new byte[2048 * 2];
            int bytesReceived = 0;
            while (true)
            {
                if (serverSocket.Available != 0)
                {
                    bytesReceived = serverSocket.Receive(buffer);

                    if (bytesReceived != 0)
                    {
                        receivedMessage = (Message)Serializer.FromStream(new MemoryStream(buffer));
                        Console.WriteLine($"Received message: {receivedMessage.Content}");

                        //handle message
                        baseHandler.handle(receivedMessage);
                    }
                }
                Thread.Sleep(100);
            }
        }

        public void SendMessage(Message msg)
        {
            Console.WriteLine($"Sending msg with content : {msg.Content}");
            MemoryStream stream = Serializer.ToStream(msg);
            var bytesSent = serverSocket.Send(stream.GetBuffer());

            Console.WriteLine("Waiting to receive");
        }
    }
}

где я создаю несколько задач для прослушивания, так как мне нужно, чтобы они были асинхронными. Это находится в поле зрения:
public void showErrorMessage(String err)
      {
          messageLog.StringValue = err;
      }

      public void openWindow()
      {
          var storyboard = NSStoryboard.FromName("Main", null);
          var controller = storyboard.InstantiateControllerWithIdentifier("UserView") as NSWindowController;
          controller.ShowWindow(this);
      }

все работает просто отлично, пока не попадает в один из этих двух методов...

Что я уже пробовал:

Я пробовал статические методы, асинхронность и ожидание, но ничего не получалось

1 Ответов

Рейтинг:
1

RickZeeland

Вы могли бы попробовать использовать TaskCreationOptions.Затяжные как уже упоминалось здесь: c# - задача.Factory.StartNew замораживание пользовательского интерфейса - переполнение стека[^]

Эта статья тоже кажется интересной: StartNew опасен[^]


Member 14833590

Я тоже пробовал этот вариант..Я искал и пытался в течение нескольких часов