我有这个背景工作者:
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
。
答案 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评论的那样,你可以使用计时器实现同样的目的。