Invoke ToolStripMenuItem - PullRequest
       18

Invoke ToolStripMenuItem

11 голосов
/ 22 августа 2011

Я пытаюсь выяснить, есть ли способ вызвать ToolStripMenuItem.

Например, я вызываю веб-службу (ASynchrously), когда возвращается результат. Я заполняю выпадающие элементы в соответствии с результатом (в методе обратного вызова)

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

, но я получаюисключение

Недопустимая операция между потоками: доступ к элементу управления '' осуществляется из потока, отличного от потока, в котором он был создан.

Функция вызова отсутствуетсвязан с элементом toolstrip , есть ли другой способ сделать это?Я пытаюсь сделать это совершенно неправильно?Любой вклад будет полезен.

Ответы [ 2 ]

20 голосов
/ 22 августа 2011

Вы пытаетесь выполнить код, который полагается на основной поток управления в другом потоке. Вы должны вызывать его, используя Invoke метод:

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

При доступе к элементам / методам управления из потока, который отличаетсяиз потока, в котором изначально создан элемент управления, вы должны использовать метод control.Invoke, он будет маршалировать выполнение в делегате invoke для основного потока.

Edit: Поскольку вы используетеToolStripMenuItem not ToolStrip, ToolStripMenuItem не имеет Invoke члена, поэтому вы можете использовать вызов формы через "this.Invoke" или ваш toolStrip его родительский "ToolStrip" Invoke, поэтому:

toolStrip.GetCurrentParent().Invoke(() =>
{
    toolStrip.DropDownItems.Add(new ToolStripItemEx("start"));
});
5 голосов
/ 22 августа 2011

Вы пытаетесь получить доступ к пункту меню из потока, а не из основного потока, поэтому попробуйте этот код:

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

if (ToolStripMenu.InvokeRequired)
{
    BeginInvoke(method);
}
else
{
    method.Invoke();
}
...