C # 3.0 и позже:
Как правило, рекомендуется использовать метод расширения, поскольку вам всегда захочется выполнить действие в реализации ISynchronizeInvoke
интерфейса , это хороший выбор дизайна.
Вы также можете воспользоваться анонимными методами (замыканиями), чтобы учесть тот факт, что вы не знаете, какие параметры передать в метод расширения; закрытие захватит состояние всего необходимого.
// Extension method.
static void SynchronizedInvoke(this ISynchronizeInvoke sync, Action action)
{
// If the invoke is not required, then invoke here and get out.
if (!sync.InvokeRequired)
{
// Execute action.
action();
// Get out.
return;
}
// Marshal to the required context.
sync.Invoke(action, new object[] { });
}
Тогда вы бы назвали это так:
private void SetText(string text)
{
textBox1.SynchronizedInvoke(() => textBox1.Text = text);
}
Здесь замыкание превышает параметр text
, это состояние захватывается и передается как часть Action
делегата , переданного методу расширения.
До C # 3.0:
У вас нет роскоши лямбда-выражений, но вы все равно можете обобщить код. Это почти то же самое, но не метод расширения:
static void SynchronizedInvoke(ISynchronizeInvoke sync, Action action)
{
// If the invoke is not required, then invoke here and get out.
if (!sync.InvokeRequired)
{
// Execute action.
action();
// Get out.
return;
}
// Marshal to the required context.
sync.Invoke(action, new object[] { });
}
И затем вы вызываете его с синтаксисом анонимного метода:
private void SetText(string text)
{
SynchronizedInvoke(textBox1, delegate() { textBox1.Text = text; });
}