我使用MSDN上详细介绍的Invoke
方法,从另一个线程中找到了一个C#表单。在主线程上调用该方法是有效的,这里是基本结构的片段:
// In the main thread:
public void doCommand(int arg, out int ret) {
ret = arg + 1;
}
// On another thread:
public delegate void CmdInvoke(int arg, out int ret);
public void execute() {
CmdInvoke d = new CmdInvoke(Program.form.doCommand);
int a = 0;
int b = 0;
Program.form.Invoke(d, new object[] { a, b });
// I want to use b now...
}
如上所述,我现在想要将参数b
返回给调用线程。目前,b
始终为0
。我读过,也许我需要使用BeginInvoke
和EndInvoke
,但我有点困惑,说实话我怎样才能到达b
?我不介意它是out
参数还是return
,我只是想以某种方式!
答案 0 :(得分:1)
您可以通过这种方式从doCommand
获取更新后的值(以普通方式返回新值return
而不是out
参数):
// In the main thread:
public int doCommand(int arg) {
return arg + 1;
}
// On another thread:
public delegate int CmdInvoke(int arg);
public void execute() {
CmdInvoke d = new CmdInvoke(Program.form.doCommand);
int a = 0;
int b = 0;
b = (int)Program.form.Invoke(d, new object[] { a });
// Now b is 1
}
out
参数不起作用,因为当您将b
放入数组object[]
时,b
的副本实际上包含在数组中(因为{{ 3}})。因此,方法doCommand
更改后不会复制原始b
变量。