使用 System.net.Sockets 连接时无法显示在 UI 上收到的消息

Unable to display the messages received on UI when using System.net.Sockets connection

我是 xamarin.forms 的新手。我想构建一个可以使用 System.net.Sockets 接收消息的 xamarin 表单应用程序。我的问题是我能够接收消息但无法在 UI.

上显示消息

我使用的是依赖服务,所以我在每个平台上都具体实现了socket方法,这是我在Android项目中的socket receive方法。我正在尝试使用消息中心将数据从 android 项目发送到 PCL 项目。 IResource 是我在 PCL.

中定义的 class
class SocketConnection : ISocket
{
Socket sSocket;
Socket serverSocket;

public void ReceiveMessage()
{
    Int32 port = 7777;


    IPAddress address = IPAddress.Parse("192.168.2.100");
    IPEndPoint ipe = new IPEndPoint(address, port);

    sSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    sSocket.Bind(ipe);
    sSocket.Listen(0);

    //receive message
    serverSocket = sSocket.Accept();
    Console.WriteLine("connection succeeded");

    while (true)
       {
           byte[] recByte = new byte[4096];
         int bytes = serverSocket.Receive(recByte, recByte.Length, 0);
            IResource.data1+=Encoding.ASCII.GetString(recByte, 0, bytes);

         MessagingCenter.Send<ISocket, string>(this,"new Messages",IResource.data1);

        Console.WriteLine("client: " + IResource.data1);

           //send message
           if (IResource.data1.Equals("exit"))
           {
               break;
           }
       }

     serverSocket.Close();
     sSocket.Close();

}
}

而在我的 pcl 项目中,我有一个按钮,当单击此按钮时,它将调用 ReceiveMessage() 方法。而且我也用过消息中心接收消息并显示在UI上,但是没有成功。这是按钮点击的方法。有谁知道问题出在哪里,是我没有正确使用消息中心,还是其他原因。 plus: 当点击按钮时, UI 变得无响应,我应该使用异步编程吗?以及如何?

提前致谢!

private async void Yes_Clicked(object sender, EventArgs e)
{
  MessagingCenter.Subscribe<ISocket,string>(this,"new Messages", (socket, data) =>
    {
        Device.BeginInvokeOnMainThread(() => {
            editor.IsVisible = true;
            editor.Text = data;

        });
    });
    DependencyService.Get<ISocket>().ReceiveMessage();  


}

where is the problem, is that i am not using messaging center correctly, or something else. plus: when the button is clicked, the UI becomes unresponsive, should I use asynchronous programming?

您正在使用 while 循环阻塞 UI 线程。如果您希望 UI 响应,您需要启动一个新线程:

Thread thread = new Java.Lang.Thread(() => {
while (true)
{
   ...

 MessagingCenter.Send<ISocket, string>(this, "new Messages", data1);

...               
});
thread.Start();