Почему 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); }
все работает просто отлично, пока не попадает в один из этих двух методов...
Что я уже пробовал:
Я пробовал статические методы, асинхронность и ожидание, но ничего не получалось