2011-07-31 11 views
2



私はC#/ VS2010でReSharperを使用しています。メインのUIスレッドでユーザーに情報を表示するためにフォームを開く必要がある別のスレッドを実行しています。私のコードは(素晴らしい作品がある)このでした:

ReSharperがform.Show()コードを修正したのはなぜですか?

this.Invoke(new MethodInvoker(delegate() 
{ 
    DisplayDownload form2 = new DisplayDownload(); 

    form2.TopMost = true; 
    form2.Show(); 
})); 



のReSharperはこれにそれを変更したいと私はそれを聞かせて(ただし、次のコードは、すべてのフォームが表示されません):

this.Invoke(new MethodInvoker(delegate() 
{ 
    using (var form2 = new DisplayDownload {TopMost = true}) 
     { 
     form2.Show(); 
     } 
})); 



フォームはReSharper修正コードでは表示されません。古いコードに戻っても問題ありません。

なぜReSharperがそれを変更した後に機能しないのですか?誰かが私にそれを説明してくれますか?変更されたコードがフォームを表示しない原因は何ですか?

答えて

4

私はそれがUSINGキーワードであると信じています。 Show()が呼び出しをブロックしていないことを考慮すると、プログラムはusingというステートメントとDispose()を使います。

よろしくお願いいたします。

+0

USING文の中でShow()呼び出しをカプセル化してはいけませんか? – fraXis

+2

Show()コールではなく、UsingステートメントでFormオブジェクトをカプセル化しないこのケースでは、他のケースでShowDialog()などを呼び出す場合は、許容可能な解決策となります。 – Tigran

+0

はい、Show()でusingを使用しないでください。 showは非モーダルな状態でフォームを残しますが、Dispose(使用の最後の括弧)はそれを閉じます。R#はそこでの区別をしません。 Formオブジェクトをローカルでインスタンス化し、IDisposableなので、アプリケーションの終了前に処理する必要があることがわかります。フォームオブジェクトは、メソッドが終了した後に「ライブ」になるので、メソッドのローカルではなく、囲むクラスのメンバーにすることを検討する必要があります。それ以外の場合は、このコードが呼び出されるたびに新しいフォームを作成します。 –

2

Resharperが表示した直後にフォームを破棄しているため、Resharperがそれを変更した後では表示されません。

しかし、あなたがメソッドの内部で「DisplayDownloadフォームを」IDisposableオブジェクトを作成しているので、ReSharperのは、そのようにそれを変更したい、とあなたはそれを使用して終了した後、「ReSharperのはShow()方法は、フォームの上映を続けることを知りません...あなたはそれを処分しませんが、あなたのDisplayDownloadをクラスレベルで宣言し、あなたのメソッドにしか表示しないでください。 like:

DisplayDownload form2 = new DisplayDownload(); 

private void YourSubMethod() 
{ 
    this.Invoke(new MethodInvoker(delegate() 
    { 
     form2.Show(); 
    })); 
} 
+0

私のポストの最初のコード例のように残しても問題ありませんか?最初の例でReSharperの例ではうまく動作しません。 USING文は問題を引き起こしていますか? – fraXis

+0

回答を更新しました。 –

関連する問題