0

質問:メソッドで作成されたScreenSaverFormを適切に破棄するにはどうすればよいShowScreensaverですか?

VisualStudioからCODEANALYSISを実行すると、次のように報告されます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を呼び出すことでアプリケーションを停止できるのは、スクリーンセーバー自体だけです。screensaverFormsはおそらく自分自身を処分する必要がありますか?

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 に答える