0
namespace Server_App
{
    
    public partial class MainWindow : Window
    {
        public TcpListener server;
        public Socket socket;
        public NetworkStream ns;
    
    public MainWindow()
        {
            InitializeComponent();

            server = new TcpListener(8888);
            server.Start();

            

}

 private void btn_Click(object sender, RoutedEventArgs e)
        {
         
            socket = server.AcceptSocket();
            ns = new NetworkStream(socket);
            StreamReader sr = new StreamReader(ns);
            tb.Text = sr.ReadLine();
            ns.Flush();
            ns.Close();
            socket.Close();
      
        }
}}

每当我从我的 android 手机发送消息时,它会在我单击按钮时在我的 serverapp 上接收。但是我想这样做,它有争议地接收我的消息,而无需每次都单击按钮。我尝试了 while(true) 语句,但我不知道它不起作用。记住它是 WPF serverapp 谁能帮助我?

4

1 回答 1

0

不要在 MainWindow 的构造函数中执行此操作,而是在与 mainwindow 的创建过程相关的事件中执行此操作,以便您可以向其添加异步。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private async void Window_Loaded(object sender, RoutedEventArgs e)
    {
        var server = new TcpListener(IPAddress.Parse("0.0.0.0"), 8888);
        server.Start();
        while (true)
        {
            var client = await server.AcceptTcpClientAsync().ConfigureAwait(false);
            
            
        }
    }
}


<Window x:Class="WpfApp1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApp1"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded">
<Grid>
    
</Grid>

用调试器检查它。通常 accepttcpclient 是一个阻塞调用。而且在这里你正在等待它变得可用。但是因为它使用异步等待,所以您的 GUI 线程变得可用。由于这种机制,您可以移动和调整窗口大小。在没有 async 和 await 的情况下尝试此操作,您的窗口甚至可能不会显示,因为加载的事件永远不会完成。但我没有对此进行测试。无论如何,如果没有异步等待或使用不同的线程,您的 GUI 线程会阻塞

与使用线程相比,异步等待是一种更现代的方法。

于 2021-03-30T18:13:46.580 回答