【问题标题】:Improving user experience in Windows Forms Client that has low internet speed and uses a WCF web-service hosted far away改善 Internet 速度低且使用远程托管的 WCF Web 服务的 Windows 窗体客户端的用户体验
【发布时间】:2013-08-30 08:41:16
【问题描述】:

我有一个在美国托管的实时 WCF 服务。我想从可以在全世界任何地方使用的 Windows 窗体应用程序访问它。目前我正在印度对其进行测试并尝试访问我在美国托管的网络服务。此应用程序可以在任何连接速度和与服务器的任何距离下使用。因此,服务器的响应速度可能会有所不同。我决定当用户执行某些功能时,我的应用程序将首先更新 UI,然后它将在后台执行服务器更新任务。这将防止应用程序冻结或挂起。以下是其中一种情况。但问题是即使我使用异步函数和线程来更新 UI 和服务器,应用程序仍然冻结。

实际上,我有一个按钮,可以在喜欢和不喜欢之间进行切换。当用户单击它时,它应该变为不同,然后它运行一个线程在后台更新服务器。下面是Button点击事件的代码:

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 按钮?因为这个“有时”会给网速较低的用户留下不好的印象。

【问题讨论】:

  • 您的changeLike() 不适合线程,您确定这运行正常吗?
  • 你为什么要在新线程上调用changeLike()?直接调用就行了。
  • 应避免创建线程以支持ThreadPoolTasks,除非您需要专门的线程来完成这项工作。你没有。

标签: c# .net multithreading wcf asynchronous


【解决方案1】:

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

【讨论】:

  • 感谢@EdChapel。我根据您的代码修改了我的代码。它工作得很好。谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多