问题:如何正确处理在方法ShowScreensaver
中创建的ScreenSaverForm?
当我从Visual Studio运行CODE ANALYSIS时,它会报告以下内容:In method 'Program.ShowScreenSaver()', call System.IDisposable.Dispose on object 'ssf' before all references to it are out of scope
。
我不明白该怎么做,因为应用程序在退出方法ShowScreenSaver()
后输入匿名消息循环。只有屏幕保护程序本身可以通过在mousemove-event上调用Application.Exit()
来停止应用程序。 屏幕保护程序可能会自行处理吗?
static class Program
{
[STAThread]
static void Main(string[] args)
{
ShowScreenSaver();
Application.Run();
}
/// <summary>
/// Display the form on each of the computer's monitors.
/// </summary>
static void ShowScreenSaver()
{
ScreenSaverForm ssf;
foreach (Screen screen in Screen.AllScreens)
{
ssf = new ScreenSaverForm(screen.Bounds);
ssf.Show();
}
}
}
屏幕保护程序类的简化代码
public partial class ScreenSaverForm : Form
{
public ScreenSaverForm()
{
InitializeComponent();
//Display pretty image
ShowprettyImage();
}
private void ScreenSaverForm_MouseMove(object sender, MouseEventArgs e)
{
if (!mouseLocation.IsEmpty)
{
// Terminate if mouse is moved a significant distance
if (Math.Abs(mouseLocation.X - e.X) > 25 ||
Math.Abs(mouseLocation.Y - e.Y) > 25)
Application.Exit();
}
// Update current mouse location
mouseLocation = e.Location;
}
}
答案 0 :(得分:1)
要遵守代码分析,您可以这样做:
static void ShowScreenSaver() {
foreach (Screen screen in Screen.AllScreens) {
ScreenSaverForm form = new ScreenSaverForm(screen.Bounds);
form.FormClosed += (sender, e) => {
form.Dispose();
};
form.Show();
}
}
如果你知道什么时候完成它并且你不再需要它,那就去除它。
答案 1 :(得分:0)
让他们自己处理。当屏幕保护程序停止并且可执行文件关闭时,它们将被释放。
如果您真的想要,可以将ssf对象设置为类级别字段,并在应用程序关闭时将其处理掉,这将是最佳练习。
您还可以让ShowScreenSaver
返回表单,并使用将表单作为参数的Application.Run
,并将一个事件添加到应用程序出口,该事件将为您处理它。
ScreenSaverForm form = ShowScreenSaver();
Application.ApplicationExit += (sender, e) => form.Dispose();
Application.Run(form);
答案 2 :(得分:-1)
首先我要说将ssf
变量带入循环
static void ShowScreenSaver()
{
foreach (Screen screen in Screen.AllScreens)
{
ScreenSaverForm ssf = new ScreenSaverForm(screen.Bounds);
ssf.Show();
}
}
此可能已解决问题。
管理,如果你需要,就可以在表单内部进行处理。