如何从C#中的异步调用返回值?

时间:2013-12-19 18:57:56

标签: c# multithreading asynchronous

我使用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。我读过,也许我需要使用BeginInvokeEndInvoke,但我有点困惑,说实话我怎样才能到达b?我不介意它是out参数还是return,我只是想以某种方式!

1 个答案:

答案 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变量。