1

このトピックに関するスレッドがいくつかあることは知っていますが、私のものは違うと思います。私のアプリケーションでは、ユーザーが今後の印刷用にいくつかのパラメーターを入力できるフォームを開きます。この印刷は、バックグラウンドワーカーで実行されることになっています。そこで、そのバックグラウンドワーカーをイベント「OnFormClosing」で起動します。

そのバックグラウンドワーカー内で、GUIにアクセスして変更/読み取る必要があるため、control.Invoke()が必要です。「時々」Invokeはinvoke呼び出し自体でスタックし続け、デリゲートを実行しません。メインスレッドは正常に動作しており、ブロックされていません。私はまだ他のことをしているGUIと対話することができます。コードを投稿する前に:control.Invoke()を実行するための他の条件はありますか?

  • メインGUIスレッドはブロックされていません
  • contorlが存在し、ハンドルが作成され、廃棄されていない必要があります

メインスレッドはフリーである必要はなく、正確に呼び出しは正しいと呼ばれますか?メインスレッドがアイドル状態になると続行する必要があります...

助けてくれてありがとう

アップデート:

その問題の間のスレッドの状況は次 ここに画像の説明を入力してください のとおりです。メインスレッドはこれを実行しています。

Application.Run(appContext);

だからそれはアイドルです。ワーカースレッドは次の行で待機しています。

fileName = (string)cbPrintFile.Invoke(new Func<String>(() => cbPrintFile.Text));

上記のように実行されません。cbPrintFileコンボボックスです

4

1 に答える 1

3

Invoke「エンキューして処理されるのを待つ」です。「スタック」している場合は、たとえば、UI スレッドがまだイベント ハンドラーでワーカーを待機しているなどの理由で、デッドロックが発生していることを示しています。Invokeコードが適切に分離されている場合は、おそらくをに置き換えることができますBeginInvoke。これにより、ワーカーは作業をキューに入れた後も続行できます。もちろん、UI がワーカーを待機しないようにするのも良いでしょう。lockこれは、両方の場所で (同じオブジェクト上で)を保持しようとすると、誤って実行される可能性があります。アプリケーションを一時停止し、ctrl+dを押しtてスレッドを起動し、ctrl+dを押しcてそれぞれの呼び出しスタックを順番に表示するだけで調査できます。

于 2013-03-11T09:01:31.190 に答える