0

问题:如何正确处理方法中创建的 ScreenSaverForm(s) ShowScreensaver

当我从 Visual Studio 运行代码分析时,它会报告以下内容:In method 'Program.ShowScreenSaver()', call System.IDisposable.Dispose on object 'ssf' before all references to it are out of scope.

我不明白该怎么做,因为应用程序在退出方法后进入匿名消息循环ShowScreenSaver()。只有屏幕保护程序本身可以通过调用Application.Exit()mousemove-event 来停止应用程序。屏幕保护程序表单是否应该自行处理?

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;
    }
}
4

3 回答 3

1

要遵守代码分析,您可以这样做:

static void ShowScreenSaver() {
    foreach (Screen screen in Screen.AllScreens) {
        ScreenSaverForm form = new ScreenSaverForm(screen.Bounds);

        form.FormClosed += (sender, e) => {
            form.Dispose();
        };

        form.Show();
    }
}

如果您知道什么时候可以使用它并且不再需要它,请摆脱它。

于 2012-04-20T14:46:28.117 回答
0

让他们自己处置。当屏幕保护程序停止并且可执行文件关闭时,它们将被释放。

如果您真的想要,您可以将 ssf 对象设置为类级别的字段,并在应用程序关闭时将其处理掉,这将是最佳实践。

您还可以ShowScreenSaver返回表单,并使用将Application.Run表单作为参数的 ,并将事件添加到将为您处理它的应用程序出口。

ScreenSaverForm form = ShowScreenSaver();
Application.ApplicationExit += (sender, e) => form.Dispose();
Application.Run(form);
于 2012-04-20T14:43:06.897 回答
-1

首先我会说将ssf变量带入循环

static void ShowScreenSaver()
{

    foreach (Screen screen in Screen.AllScreens)
    {
        ScreenSaverForm ssf = new ScreenSaverForm(screen.Bounds);
        ssf.Show();
    }
}

可能已经解决了一个问题。

如果您需要,管理表单本身内部的处理就足够了。

于 2012-04-20T14:40:14.310 回答