2011-12-18 36 views
6

我在理解BeginInvoke()方法調用委託時異常地調用方法,在完成它的任務之後爲什麼不能從BeginInvoke()方法返回方法的返回值,爲什麼需要EndInvoke ()來查詢BeginInvoke()並從中返回返回值。 我知道這可能是不是一個很好的查詢,但我的困惑是真正的:-)爲什麼我們需要EndInvoke()來在委託中返回異步調用的值?

加法:我可以調用一個方法異步使用DelagateName.BeginInvoke(參數),現在當在委託匹配方法(假設它返回一個值)完成它的工作並返回一個值,爲什麼我需要DelegateName.EndInvoke()來獲取返回的值?爲什麼第一個調用本身不能在方法完成時返回值。

回答

8

BeginInvoke返回時,該方法還沒有完成 - 這就是它的異步點。所以BeginInvoke只能給你一個表示某個結果的「承諾」的令牌 - 並且你使用這個承諾得到使用EndInvoke實際結果,通常在回調中。

在.NET 4,這是使用Task當然Task<T>更愉快包封,但泛型不是的.NET 1份,因此,爲代表的稍微更令人費解的方法。

+0

感謝Jon,這真的解決了我的疑問:-),我想通過外行人的語言,BeginInvoke完成了獲取呼叫的工作,並將控制權交給了承諾照顧Job的承諾,因此它不能再做任何返工,因此EndInvoke()將被要求稍後做這項工作......(我猜我在想對!) – mohits00691 2011-12-18 13:00:17

+0

@ mohits00691:不太明白我怎麼表達它,但我認爲你有正確的想法:) – 2011-12-18 13:02:57

+0

謝謝喬恩,幫助我清除了這個疑問,我想我會繼續潛水的時間越來越多,非常感謝大家。 – mohits00691 2011-12-18 13:05:43

8

如果您想要異步調用委託,則只需要BeginInvoke和匹配EndInvoke即不會阻塞當前線程。這對調用您不控制的進程的長時間運行的方法或方法非常有用,例如跨應用程序邊界。

從你所描述的情況來看,使用Invoke方法可能會更好,它將在同一個方法中 - 並且在同一個線程上同時返回值。當然,在這種情況下,你的線程可能被長時間運行的進程阻塞。這取決於你正在嘗試做什麼。

相關問題