1

私のアプリケーション (C#、VS2008) は、ネットワーク経由でデータベース (SQL Server 2008 Express) から情報を読み込みます。(おそらく)長い待機中に、「読み込み中...」ダイアログボックスを別のスレッドで実行して表示したいのですが、操作に特定の時間(たとえば500ミリ秒)以上かかる場合のみです。

そのため、これまでのところ、読み込みダイアログフォームの所有者を設定せずに (つまり、LoadingDialog.ShowDialog() を呼び出して) 500 ミリ秒後に読み込みフォームが表示されるようになりました (つまり、LoadingDialog.ShowDialog() を呼び出します) が、LoadingDialog.ShowDialog(IWin32Window所有者) 所有者がメイン フォームに設定されている (スレッドのパラメーターを介して渡される) スレッド間のコントロールへのアクセスに関する InvalidOperationException が発生します。

私の基本的な質問は、所有者パラメーターが別のスレッドのフォームに設定されたフォームを作成して ShowDialog できますか? ローディングダイアログがアプリケーションの残りの部分でモーダルになるように、つまり、他のダイアログがフォーカスを取得し、他の場所での入力を許可しないように、これを行いたいと思います。

誰でも提案できますか?運の悪いスプラッシュスクリーンについて、また運の悪い Invoke と BeginInvoke についてたくさん読んだことがあります。これについて別の方法がありますか?

わからないことがあればお気軽にご質問ください。

Merci(フランス語で言うように)、

ジェイコブ。

4

3 に答える 3

1

必要な数のUIスレッドを作成できます。次のコードでうまくいくはずです。

    Thread thread = new Thread(new ThreadStart(() => Application.Run(new MyForm())));
    thread.SetApartmentState(ApartmentState.STA);
    thread.IsBackground = true;
    thread.Start();
于 2010-11-05T03:08:01.967 に答える
1

すべての UI コンポーネントは、win32 メッセージ ループ上で実行される単一のスレッドで実行されます。別のスレッドで UI コンポーネントを実行することはできません。このアーキテクチャは、Windows 3.1 以降維持されています。

于 2009-11-02T12:01:54.430 に答える
1

You should run your long process in a background thread, and then show your Loading... form as a non-modal dialog. That way, the user can see the Loading indication, but still interact with other parts of the system while its going on.

Another option would be to show the loading progress in a status bar or similar. The key is to make sure the long operation is done on a background thread and all the GUI logic is done on the GUI thread.

A good threading format might look like (this is just pseudocode for demonstration purposes - you need to use Invoke to get the appropriate threading):

RunInBackground(DoLongOperation);
ShowLoadingDialog();
...

DoLongOperation()
{
    LongOperation();
    RunOnGUI(FinishLongOperation);
}

FinishLongOperation()
{
   CloseLoadingDialog();
}
于 2011-04-26T15:01:45.007 に答える