我認爲在相同的委託實例上多次調用BeginInvoke
會導致問題,但我試了一下,它的工作原理。 這是爲什麼?爲什麼您可以在同一個委託實例上多次調用BeginInvoke?
是否每個BeginInvoke
都返回IAsyncResult
對象,而不是每個委託實例調用?
換句話說,我是否只需要委託的一個實例來產生對其函數的多次調用?
我認爲在相同的委託實例上多次調用BeginInvoke
會導致問題,但我試了一下,它的工作原理。 這是爲什麼?爲什麼您可以在同一個委託實例上多次調用BeginInvoke?
是否每個BeginInvoke
都返回IAsyncResult
對象,而不是每個委託實例調用?
換句話說,我是否只需要委託的一個實例來產生對其函數的多次調用?
每次調用BeginInvoke
都會觸發對.net線程池的新請求。
多次撥打BeginInvoke
是完全可以接受的。每個IAsyncResult
對象對於特定呼叫BeginInvoke
都是唯一的。
只要注意確保您撥打電話號碼EndInvoke
即可撥打電話BeginInvoke
,以確保清理資源。
(請注意,每次調用並不一定等同於一個線程。BeginInvoke
傳遞請求的線程池,這可能排隊的請求,如果所有池中的線程都已經在使用)
例如,您可能有多個線程調用相同的委託實例,因爲您希望它們都執行相同的任務。
爲什麼它不起作用?每次調用它時,它都會開始在線程池線程上執行該委託的操作。是的,每個IAsyncResult
將獨立於其他,表示該異步操作。
是的,你只需要委託的一個實例。請注意,代表是不可變的 - 呼叫BeginInvoke
不會改變其狀態。您可以放心地拿一份委託參考的副本,因爲知道調用Delegate.Combine
等總是會創建一個委託實例,而不是修改現有委託。
是的。
每次撥打BeginInvoke
時都會返回一個不同的IAsyncResult
,可以按任意順序傳遞給EndInvoke
。
您可以使用相同的委託進行多個異步調用。