3

我正在开发一些在服务器端进行计算的软件。我曾尝试使用 BackgroundWorker,它工作得非常好,直到我尝试从胖客户端切换到 Web 服务。发生错误(由于我的同事告诉我,我已经预料到了)“BackgroundWorker 未标记为可序列化”。我的应用程序的目标是使用计算进度以及当前正在计算的记录的名称来更新客户端。如果需要,我可以发布一些代码,但在这种情况下,我怀疑它是否真的与问题相关。我试图实现的方案可以如下所示:

  • 客户点击“准备”按钮
  • 服务器接到电话
  • 服务器发送数据
  • 客户收到记录清单以确认
  • 客户确认他们的选择(然后我设置后台工作人员并将其发送到服务器)
  • 服务器获得调用(接收后台工作人员的引用,以及一次计算所需的所有记录)
  • 通过循环遍历记录(每次计算大约需要 1-3 秒),像这样更新 BackgroundWorker 的状态:

    worker.ReportProgress(i * 100 / ids.Length, "Currently counting: " + id + "...");
    Calculate(ids[i]);
    worker.ReportProgress((i+1) * 100 / ids.Length, "Currently counting: " + id + "...");
    

有什么方法可以实现我也在网络服务上尝试的工作吗? 我认为这需要将 BackgroundWorker 欺骗到 Serializable 中,或者可能有其他方法可以将状态从服务器更新到客户端?

PS我没有从服务器发送很多数据(实际上我什至可以尝试只发送更少的数据,比如id),所以我认为这不会是过载的问题。

4

3 回答 3

4

基本上,当您为 Web 编写代码时,您正在处理一个完全不同的模型,它基于请求/响应而不是持续交互。

您可能应该让您的初始请求返回一种“任务 ID”(可以是任何唯一 ID),然后快速返回。同时,您在后台启动任务。然后,客户端可以轮询该特定任务的状态。您可以使用“长轮询”,其中每个请求都会挂起,直到状态发生变化,或者只是让客户端定期调用服务器。无论哪种方式,响应都只是进度(处理的记录数和当前记录的名称)。

于 2012-10-18T07:05:21.833 回答
0

恐怕您正在尝试序列化具有后台工作成员变量的类的实例。这是不可能的,因为后台工作人员不是可序列化的对象。

你可以在这里做的是 -

  • 创建一个具有异步运行方法的类。
  • 在该类中创建一个成员变量,用于存储后台工作人员的进度
  • 在类中创建一个返回进度值的 Web 方法。

现在在您的页面上,您需要

  • 调用必须异步运行的方法。
  • 放置一个定期执行的客户端javascript。它应该查询 Web 服务并询问进度。
    • 更新页面并显示进度。

我希望我已经正确解释了。

于 2012-10-18T07:07:45.737 回答
0

如果您希望不时(在完成某个里程碑时)通过服务获取流程更新,我建议您使用异步服务。使用 WCF 并创建一个异步服务(您可以查看以下主题:http: //blogs.msdn.com/b/rjacobs/archive/2011/06/30/how-to-implement-a-wcf-异步服务操作与任务 lt-t-gt.aspx)。

创建一些方法,例如

public int onBlockComplete(IAsyncResult result)
{
    //...
}

并在您的客户中处理此问题。还实现了一个方法来在整个过程完成时进行回调。

通过这种方式,您可以处理块完成事件并在客户端显示进度。

当然,如果您在 ASP.NET 中实现客户端,则必须刷新页面才能看到更新。

于 2012-10-18T07:10:14.567 回答