int x = 5;
object [] parms = new object []{x};
То, что делает приведенный выше код, объявляет локальную переменную, присваивает ей значение 5, затем создает массив object[]
, содержащий один элемент, который является копией этой локальной переменной.
Затем вы передаете этот массив в ваш Invoke
вызов.
Я думаю, вы обнаружите, что после вызова Invoke
, parms[0]
равно 15. Но это не влияет на x
, который фактически должен был бы быть передан как параметр ref
для любой метод, чтобы иметь возможность изменять его локальное значение.
То, что я видел, было сделано примерно так:
class Box<T>
{
public T Value { get; set; }
}
Тогда вы можете сделать:
void MyThreadFunc()
{
var x = new Box<int> { Value = 5 };
// By the way, there's really no reason to define your own
// mes_del delegate type.
Invoke(new Action<Box<int>>(MessageFunc), x);
}
void MessageFunc(Box<int> arg)
{
arg.Value = 15;
}