0

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

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

登录步骤:

  1. 按下登录按钮,该按钮以数据为参数调用发送方法
  2. 控制器已订阅事件回调
  3. 收到响应后,将触发 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();
        });
}

一切正常,但...

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

4

0 回答 0