C# 在基于事件的GUI应用程序中处理客户机-服务器通信

C# 在基于事件的GUI应用程序中处理客户机-服务器通信,c#,events,asynchronous,task,taskcompletionsource,C#,Events,Asynchronous,Task,Taskcompletionsource,和我的朋友一起,我们正在制作一个简单的聊天应用程序。客户端是C语言,服务器是Java语言。整个通信是基于WebSocket的 我在设计最佳应用程序流方面有问题。目前它是这样工作的: 登录步骤: 按login按钮,以数据为参数调用Send方法 控制器已订阅事件回调 收到响应后,将触发OnLogin事件 示例代码: void Login() { var packet = new LoginDataPacket() { Login = login, Password = Security

和我的朋友一起,我们正在制作一个简单的聊天应用程序。客户端是C语言,服务器是Java语言。整个通信是基于WebSocket的

我在设计最佳应用程序流方面有问题。目前它是这样工作的:

登录步骤:

  • 按login按钮,以数据为参数调用Send方法
  • 控制器已订阅事件回调
  • 收到响应后,将触发OnLogin事件
  • 示例代码:

    void Login()   
    {
        var packet = new LoginDataPacket() { Login = login, Password = SecurityHandler.GetShaWithSalt(password) };
    
        LoginEndpoint.Send(typeof(LoginDataPacket).Name, packet);
        LoginView.LoginStarted(); 
    }
    
    
    void OnLoginStatus(LoginStatusPacket packet)
    {
        if (packet.Status)
        {
            LoginView.LoginSuccess();
        }
        else
        {
            LoginView.LoginFailed();
        }
    }
    
    在视野中的某个地方:

     public void LoginFailed()
        {
            this.InvokeOnRequired(() =>
            {
                SetControlsState(true);
                labelStatus.ForeColor = Color.Red;
                labelStatus.Text = "Failed to login";
            });
    
        }
    
    public void LoginSuccess()
    {
        this.InvokeOnRequired(() =>
            {
                SetControlsState(true);
                labelStatus.ForeColor = Color.Green;
                labelStatus.Text = "Login OK!";
                Close();
            });
    }
    
    一切正常,但


    我想知道在登录方法中操作是否成功。我不能这样做,因为我的网络库使用事件接收数据,还因为它会阻止主线程,然后UI会被冻结。问题是应该如何正确地做?我读了一些关于async/await和TaskCompletionSource的文章,但我不确定如何在我的案例中使用它。

    我读了一些关于async/await和TaskCompletionSource的文章,但我不确定如何在我的案例中使用它。
    当你研究这个功能时,你发现了什么?你在你看过的关于这个主题的教程中发现了什么?在这些特性的初始测试或实验中,您遇到了什么问题?很明显你走对了方向。我不知道我的说法是否正确。我想读一些关于在其他项目中如何处理这种情况的文章。如果你继续学习更多关于这个主题的知识,尝试一下,研究一下它是如何使用的,以及其他人是如何使用它来解决这个问题的,那么你就会明白这一点。