改善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键?因为这"有时"会给网速较低的用户留下不好的印象。

改善Windows窗体客户端的用户体验,该客户端网速低,使用远程托管的WCF web服务

首先,我假设在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;
}