2

我有这个背景工作者:

    MyBackgroundWorker.DoWork += ((sender, arg) =>
        {
            while (true)
            {
                client.GetkFailuresCompleted += ((s, e) =>
                {
                    int[] arr = JsonHelper.Deserialize<int[]>(e.Result);

                    int error = (int)((arr[0] / (double)arr[1]) * 100);

                    Debug.WriteLine("Error %: " + error);

                    this.Dispatcher.BeginInvoke(() =>
                        {
                            ErrorOverviewPointCollection.Clear();
                            ErrorOverviewPointCollection.Add(new Point(1, 100 - error));
                            ErrorOverviewPointCollection.Add(new Point(1, error));
                        });
                });
                client.GetFailuresAsync();

                Thread.Sleep(5000);
            }
        });

正如你所见,我永远在运行它。我没有实现任何停止/失败功能来停止BackgroundWorker,但我需要吗?如果用户关闭浏览器,应用程序应该停止吗?

访问一个 Web 服务,该DoWork服务在完成时更新一个ObservableCollection数据绑定到 silverlight 应用程序的 Web 服务。

4

2 回答 2

0

如果您不作为浏览器外的应用程序执行它并不危险。请记住,所有非 OOB silverlight 应用程序都在插件中执行,一旦您关闭浏览器应用程序,插件就会关闭,并终止其中运行的所有代码。

也就是说,我并不是说在 OOB 环境中执行它是危险的代码。但为了安全起见,您应该在关闭 OOB silverlight 窗口后对其进行测试以查看它是否仍然存在。

但是,最佳做法是更换

while(true)

while(bApplicationIsAlive)

并在应用程序退出的事件处理程序中将 bApplicationIsAlive 设置为 false。

于 2013-08-01T07:00:04.137 回答
0

如果你没有任何可支配的资源,那就没问题了。如果你这样做了,那么你应该实现某种停止机制来优雅地停止后台工作。

此外,使用异步模式,您真的不需要那个后台工作人员。这是可行的:

client.GetFailuresCompleted += (s, a) =>
{
    // do work...

    Thread.Sleep(5000);
    client.GetFailuresAsync();
};
client.GetFailuresAsync();

这将避免为了调用异步方法而保持循环。此外,它还具有将等待时间延迟到处理响应之后的优点,因此调用不会重叠(以防调用和处理响应花费的时间超过 5 秒)。

正如 Jon Skeet 评论的那样,您可以使用计时器来实现相同的目标。

于 2013-08-01T07:10:12.940 回答