如何妥善处理多种形式

时间:2012-04-20 14:29:40

标签: c#

问题:如何正确处理在方法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;
    }
}

3 个答案:

答案 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();
    }
}

可能已解决问题。

管理,如果你需要,就可以在表单内部进行处理。