Я не уверен, что правильно понял ваш вопрос, но попробую предположить, что вы считаете, что Invoke должен вызываться у того контрола, действия с которым вы хотите совершить. Это не так - вы можете вызвать Invoke на любом контроле, который работает в том UI-потоке, контролы в котором вы хотите изменить.
Т.е. вы можете делать так:
private void AddTag(bool onstart)
{
if (tagList.InvokeRequired)
tagList.Invoke(new Action(() => BlockUI(onstart)));
else
BlockUI(onstart);
}
Вместо tagList может быть любой контрол, работающий в этом UI-потоке. Например, пусть у вас на форме три кнопки:
private void button1_Click(object sender, System.EventArgs e)
{
var t = new Thread(new ThreadStart(() =>
{
if (button3.InvokeRequired)
{
button3.Invoke(new Action(() =>
{
button1.Text = "new button1 name";
button2.Text = "new button2 name";
button3.Text = "new button3 name";
}));
}
else
{
button1.Text = "new button1 name";
button2.Text = "new button2 name";
button3.Text = "new button3 name";
}
}));
t.Start();
}
Кстати, форма тоже является контролом, так что в этом примере можно писать и так:
private void button1_Click(object sender, System.EventArgs e)
{
var t = new Thread(new ThreadStart(() =>
{
if (InvokeRequired)
{
Invoke(new Action(() =>
{
button1.Text = "new button1 name";
button2.Text = "new button2 name";
button3.Text = "new button3 name";
}));
}
else
{
button1.Text = "new button1 name";
button2.Text = "new button2 name";
button3.Text = "new button3 name";
}
}));
t.Start();
}