13

ToolStripMenuItem を呼び出す方法があるかどうかを調べようとしています。

たとえば、結果が返されたときに Web サービス (ASynchrously) を呼び出しています。結果に従ってドロップダウン項目を入力します (コールバック メソッドで)。

 ToolStripMenuItem.DropDownItems.Add(new ToolStripItemEx("start"));

しかし、私は例外を取得します

クロススレッド操作が無効です: コントロール '' は、それが作成されたスレッド以外のスレッドからアクセスされました。

ツールストリップ項目に関連付けられた呼び出し関数はありません。これを行う別の方法はありますか? 私はこれを完全に間違った方法でやろうとしていますか? どんな入力でも役に立ちます。

4

2 に答える 2

24

別のスレッドの制御メインスレッドに依存するコードを実行しようとしています。次のInvokeメソッドを使用して呼び出す必要があります。

toolStrip.Invoke(() =>
{
    toolStrip.DropDownItems.Add(new ToolStripItemEx("start"));
});

コントロールが最初に作成されたスレッドとは異なるスレッドからコントロールのメンバー/メソッドにアクセスする場合は、control.Invokeメソッドを使用する必要があります。これにより、メインスレッドへの呼び出しのデリゲートで実行がマーシャリングされます。

編集:ToolStripMenuItem notを使用しているためToolStrip、にToolStripMenuItemはメンバーがありませんInvoke。したがって、フォームinvokeby" this.Invoke"またはtoolStripその親" ToolStrip"Invokeを使用できます。したがって、次のようになります。

toolStrip.GetCurrentParent().Invoke(() =>
{
    toolStrip.DropDownItems.Add(new ToolStripItemEx("start"));
});
于 2011-08-22T09:28:53.780 に答える
5

メイン スレッドではなくスレッドからメニュー項目にアクセスしようとしている場合は、次のコードを試してください。

MethodInvoker method = delegate
{
    toolStrip.DropDownItems.Add(new ToolStripItemEx("start"));
};

if (ToolStripMenu.InvokeRequired)
{
    BeginInvoke(method);
}
else
{
    method.Invoke();
}
于 2011-08-22T09:52:10.513 に答える