改善Windows窗体客户端的用户体验,该客户端网速低,使用远程托管的WCF web服务
本文关键字:客户端 WCF 服务 web 程托管 窗体 Windows 用户 体验 改善 | 更新日期: 2023-09-27 18:29:41
我在美国托管了一个实时WCF服务。我想从一个可以在世界任何地方使用的Windows窗体应用程序访问它。目前我正在印度测试它,并试图访问我在美国托管的网络服务。该应用程序可以在任何连接速度和与服务器的任何距离使用。因此,服务器的响应速度可能会有所不同。我决定,当用户执行某些功能时,我的应用程序将首先更新UI,然后在后台执行服务器更新任务。这样可以防止应用程序冻结或挂起。以下是其中一个场景。但问题是,即使我使用异步函数和线程来更新UI和服务器,应用程序仍然处于冻结状态。
事实上,我有一个按钮,可以在相似和不同之间切换。当用户单击它时,它应该更改为不同,然后运行一个线程在后台更新服务器。以下是按钮点击事件的代码:
async private void btnLike_Click(object sender, EventArgs e)
{
new System.Threading.Thread(new System.Threading.ThreadStart(changeLike)).Start();
await LikeContent();
}
changeLike
功能:
private void changeLike()
{
if(btnLike.Text.Equals("Like"))
btnLike.Text="Unlike";
else
btnLike.Text="Like";
}
LikeContent
功能:
async Task<int> LikeContent()
{
await Global.getServiceClient().addContentLikeAsync(cid, uid);
System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(reloadLikes));
t.Start();
return 0;
}
addContentLikeAsync()
函数是一个WCF web服务函数,用于更新服务器上的用户点赞。reloadLikes()
在用户点赞内容之后更新来自服务器的点赞次数。
请告诉我如何修改我的代码,使应用程序立即更新LIKE按钮,而不是冻结一段时间,然后更新LIKE键?因为这"有时"会给网速较低的用户留下不好的印象。
首先,我假设在UI线程上调用btnLike_Click
方法。在这种情况下,不要在单独的线程上调用changeLike()
。
async private void btnLike_Click(object sender, EventArgs e)
{
changeLike();
await LikeContent();
}
其次,确保在reloadLikes()
之前封送回UI线程
async Task<int> LikeContent()
{
await Global.getServiceClient().addContentLikeAsync(cid, uid);
// Ensures this occurs on the UI thread - WinForms
Invoke((Action)reloadLikes);
return 0;
}