2013-12-19 52 views
1

我有一個C#表單,我使用了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

你能用'Func '嗎? –

+0

您正在使用錯誤的工具。說明你使用的版本。 C#5? –

+0

爲什麼你首先要做這件事?如果你有一個後臺線程做一些工作,並且你調用Invoke來更新UI,爲什麼UI更新需要將信息發送回長時間運行的任務?首先這是一個非常不尋常的要求。 – Servy

回答

1

可以以這樣的方式得到doCommand更新值(作爲out參數在普通方式與return沒有返回新值):

// 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實際上是包含在數組中(因爲boxing)。因此,方法doCommand更改該複製不是原始b變量。

+0

像夢一樣工作,謝謝! –