В моих других методах я мог сделать что-то вроде этого,
public void Add(T item)
{
if (dispatcher.CheckAccess())
{
...
}
else
{
dispatcher.Invoke(new Action<T>(Add), item);
}
}
Но как я вызываю свойство для такой ситуации?
public T this[int index]
{
get
{
...
}
set
{
if (dispatcher.CheckAccess())
{
...
}
else
{
dispatcher.Invoke(???, value, index); // <-- problem is here
}
}
}
Изменить: Следующий абзац больше не применяется, так как вопрос OP с тех пор был отредактирован .
Во-первых, ваш второй код кажется логически неверным : очевидно, вы хотите вызвать установщик, но хотя вы указываете значение для индекса
, вы не указываете фактическое значение
(то есть элемент
). Я вернусь к этому вопросу через секунду.
Вы можете обернуть анонимный делегат или лямбда-функцию вокруг установщика свойств , например (с использованием анонимного делегата), чтобы сделать его вызываемым:
dispatcher.Invoke(
new Action<T>( delegate (T item) { this[index] = item; } ),
item );
или (с использованием лямбда-функции, доступной с версии языка C # 3):
dispatcher.Invoke(
new Action<T>( (T item) => { this[index] = item; } ),
item );
Примечание: Вы создаете анонимный делегат или лямбда-функцию, которая принимает один аргумент ( поз.
). Другой обязательный аргумент ( index
) берется из «внешнего» контекста. (На ум приходит термин закрытие .) Я считаю, что это единственный способ избежать замены диспетчера
на тип делегата, который иногда вызывается с двумя аргументами вместо один.
Если это не проблема, код Invoke
может измениться, например, на:
dispatcher.Invoke(
new Action<int,T>( (int index, T item) => { this[index] = item; } ),
index, item );