既存のプロジェクトで作業していますが、私はWinFormsを使用しなければなりません(しばらくの間使っていない)UIスレッドと同期する問題があります。UIスレッドとワーカーを同期させる
私が統合しなければならないデザインは、次のようになります。は、Action
をパラメータとして取得し、非同期に実行します。私が取り組んでいるアクションには2つの部分があります。コア・クラス(ビジネス・ロジックを含む)と、ユーザーの対話を要求しなければならない場合、イベントによってコアによって通知されるGUI部分。
私はこれで
if (!IsHandleCreated)
{
//be sure to create the handle in the constructor
//to allow synchronization with th GUI thread
//when using Show() or ShowDialog()
CreateHandle();
}
フォームのコンストラクタにハンドルの作成を追加した、コードは以下を動作します。
private DialogResult ShowDialog(Form form)
{
DialogResult dialogResult = DialogResult.None;
Action action = delegate { dialogResult = form.ShowDialog(); };
form.Invoke(action);
return dialogResult;
}
この例では、起動場所は、Windowsに設定されていますデフォルト。
ParentWindow
が
IWin32Window
のインスタンスであると
WindowStartupLocation
が
CenterParent
に設定されている
Action action = delegate { dialogResult = form.ShowDialog(ParentWindow); };
:私はそれを変更した場合
。 form.Invoke(action)
を呼び出すと、クロススレッド例外が発生します。
クロススレッド操作が有効でない:コントロール 'ActivationConfirmationForm'が、作成されたスレッド以外のスレッドからアクセスされました。
質問:
CenterParent
として起動場所を設定するときに、なぜクロススレッドの例外しかないのですか?そして、どうすればそれを避けることができますか?- はなぜ常に
false
のですか?
どちらもおそらく関連しています!
[編集] @Reniuz: あなたがここに何が不足していない;) コールは私の処分で
private static void OnActivationConfirmationRequired(DmsPackageConfiguratorCore sender,
ConfigurationActivationConfirmationEventArgs args)
{
args.DoAbort = (ShowDialog(new ActivationConfirmationForm(args.Data)) == DialogResult.No);
}
すべてがGUIであるコアによって通知されたリスナーから作られていますインターフェイス
/// <summary>
/// Interface defining methods and properties used to show dialogs while performing package specific operations
/// </summary>
public interface IPackageConfiguratorGui
{
/// <summary>
/// Gets or sets the package configurator core.
/// </summary>
/// <value>The package configurator core.</value>
IPackageConfiguratorCore PackageConfiguratorCore { get; set; }
/// <summary>
/// Gets or sets the parent window.
/// </summary>
/// <value>The parent window.</value>
IWin32Window ParentWindow { get; set; }
/// <summary>
/// Gets the package identifier.
/// </summary>
/// <value>The package identifier.</value>
PackageIdentifier PackageIdentifier { get; }
}
は、「CenterParent」のために、または実際に親ウィンドウを設定しているため(つまり、 'CenterParent'設定を削除しても起動します)、クロススレッド例外が発生します。 – Strillo
@ Strillo ParentWindow – Philippe
フォームを呼び出して自分自身を表示するように設定すると、常に起動しますか?またはIamはここに何かを逃している?すべてのコードを投稿できますか? – Reniuz