在银光中有一段时间(真实)是危险的吗?

时间:2013-08-01 06:54:51

标签: c# multithreading silverlight

我有这个背景工作者:

    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,但是我需要吗?如果用户关闭浏览器,应用程序应该停止正确吗?

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

2 个答案:

答案 0 :(得分:0)

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

那就是说,我说在OOB环境中执行是危险的代码。但为了安全起见,您应该在关闭OOB silverlight窗口后测试它是否仍然存活。

但是,最佳做法是更换

while(true)

while(bApplicationIsAlive)

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

答案 1 :(得分:0)

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

此外,使用异步模式,您实际上不需要该后台工作程序。这是可行的:

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

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

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

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