14

メッセージボックス ダイアログがある ThreadPool.QueueUserWorkItem を介してスレッドを起動します。

System.Windows.Forms.DialogResult dr = System.Windows.Forms.MessageBox.Show("バックグラウンドでアップグレードをダウンロードしますか? ..", "アップグレード可能", MessageBoxButtons.YesNo);

正常に動作しているように見えますが、一部の顧客がメッセージのポップアップが表示されないことを示唆したため、少し疑わしいです. .NET フレームワーク 2.0 以降では、この特定の呼び出しをマーシャリングする必要はないと感じました。マーシャリングは自動的に行われます。正しい?

これは興味のある部分的なトピックです: MessageBox.Show でオーナー ウィンドウを使用する理由

4

4 に答える 4

11

原則として、メイン/アプリケーション スレッドの外で GUI 作業を行うべきではありません。Invoke を実行できる親フォームに ShowMessageBox メソッドを作成します。

public DialogResult ShowMessageBox (String message, String caption)
{
    if (this.InvokeRequired) {
        return (DialogResult) this.Invoke (new PassStringStringReturnDialogResultDelegate (ShowMessageBox), message, caption);
    }
    return MessageBox.Show (this, message, caption);
}

public delegate DialogResult PassStringStringReturnDialogResultDelegate (String s1, String s2);

ただし、注意してください: マルチスレッド GUI アプリをデバッグし、メイン/アプリケーション スレッド以外のスレッドでデバッグする場合は、[プロパティの評価とその他の暗黙的な関数呼び出しを有効にする] オプションをオフにする必要があります。そうしないと、VS が現在のスレッドからローカル/グローバル GUI オブジェクトの値を自動的に取得するため、アプリケーションが奇妙な方法でクラッシュ/失敗する原因となります。[ツール] -> [オプション] -> [デバッグ] に移動して、その設定をオフにします。

大文字で申し訳ありませんが、アプリをデバッグしようとするたびにハングアップしてからクラッシュする理由を理解するのに数日かかりました。

于 2009-02-18T04:33:36.327 に答える
5

MessageBox正しいフォーカスを取得できるのであれば、マーシャリングしてウィンドウを指定します。フォームがフォームの背後にあり、フォアグラウンドにある必要があることを認識していないため、単にフォームが表示されない可能性があります。

于 2009-02-17T23:48:51.813 に答える
0

これはアプリケーションですか、それともサービスですか。サービスの場合、「デスクトップとの対話を許可する」権限が設定されていない可能性があります。

サービス コントロール パネル アプレットでサービスのプロパティを表示します。

于 2009-02-17T23:51:13.603 に答える