与我的朋友一起,我们正在制作简单的聊天应用程序。客户端使用Java编写C#和服务器。整个通信基于WebSockets。
我在设计最佳应用程序流程时遇到问题。目前它的工作方式如下:
登录步骤:
示例代码:
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的内容,但我不确定如何在我的情况下使用它。