在基于GUI事件的app中处理客户端 - 服务器通信

时间:2015-04-09 17:26:56

标签: c# events asynchronous task taskcompletionsource

与我的朋友一起,我们正在制作简单的聊天应用程序。客户端使用Java编写C#和服务器。整个通信基于WebSockets。

我在设计最佳应用程序流程时遇到问题。目前它的工作方式如下:

登录步骤:

  1. 按登录按钮,调用Send方法,数据为参数
  2. Controller已订阅事件回调
  3. 收到回复后,会触发OnLogin事件
  4. 示例代码:

    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();
            });
    }
    

    一切正常,但......

    我想知道在Login方法中是否成功运行。我不能这样做,因为我的网络库使用事件接收数据,也因为它会阻塞主线程,然后UI将被冻结。问题是应该如何正确完成?我读了一些关于async / await和TaskCompletionSource的内容,但我不确定如何在我的情况下使用它。

0 个答案:

没有答案