適用於:Excel 2013 |Office 2013 |Visualstudio
Microsoft Excel 2013 可以異步呼叫使用者定義函式。 以異步方式呼叫函式,可以允許同時執行數個計算來改善效能。 在計算叢集上執行使用者定義的函數時,非同步呼叫函數允許使用數部電腦來完成計算。
使用異步使用者定義函式的時機
某些使用者定義函式必須等候外部資源。 等候時,會封鎖 Excel 計算線程。 在 Excel 2013 中,使用者定義函式可以異步執行。 這會釋放計算線程,以便在用戶定義函數等候時執行其他計算。
在 Excel 2007 中,程式設計人員可以藉由增加多線程重新計算中使用的線程數目,同時執行多個使用者定義函數。 這個方法有缺點,主要原因是線程數目是範圍設為應用程式的設定,無法在單一函式或載入宏的層級控制。
當函式必須等候外部資源時,程式設計人員應該使用異步使用者定義函數調用。 例如,透過因特網傳送SOAP要求的函式必須等候網路傳遞要求、遠端伺服器完成要求,以及網路傳回結果。 在此情況下,不會發生任何重大運算,而且 Excel 可以繼續進行其他計算。
當函式將要求傳送至計算叢集時,程式設計人員也可以使用異步使用者定義函數。 在此情況下,不僅需要等待網路等待,叢集還可以在不同的伺服器上執行個別呼叫。 藉由不等待每個呼叫完成,呼叫可以重疊以改善效能。 在某些情況下,這項改善相當顯著。
注意事項
用戶定義函式無法同時註冊為異步和叢集安全。
撰寫異步用戶定義函數
異步使用者定義函數必須追蹤句柄,並在通知 Excel 函數調用已完成時使用該句柄。 異步使用者定義函數會分割成兩個部分。 第一個片段是標準 UDF 進入點,它會啟動第二個個別的異步操作。 在 UDF 進入點期間,應該對 Excel 進行回呼。 然後,函式的第一個啟動部分會將其計算線程的控制權傳回 Excel,以繼續計算。 當第二個異步操作完成時,它必須回呼 Excel,並提供 Excel 其結果。
注意事項
傳入 UDF 的任何自變數,只要是函式異步部分所需的自變數,都必須深層複製,因為當 UDF 進入點傳回時,Excel 會釋放這些自變數。
Excel 提供一組 XLL 載入宏可用來管理異步 UDF 呼叫生命週期的事件。 這些事件表示 Excel 已完成計算,或計算已取消。
宣告異步函式
註冊異步使用者定義函式時,您必須將它們宣告為異步。 這是藉由新增參數來執行,該參數會指向註冊類型字串中以 「X」 表示的XLOPER12結構,在 UDF 參數列表中的任何位置。 Excel 會使用此參數來傳遞異步呼叫句柄。 XLL 載入宏必須在結果就緒時,將異步呼叫句柄和函式的結果傳回 Excel。 此外,UDF 的傳回型別應該是 void,由 「>指定為類型字串中的第一個字元」。 傳回型別為 void,因為 UDF 的同步部分不會將值傳回 Excel。 相反地,XLL 載入宏會透過回呼以異步方式傳回值。
您可以將異步函式宣告為安全線程,然後在多線程重新計算中使用 UDF 的同步部分。
下列程式代碼範例顯示以 「>QX」 作為註冊類型字串註冊的異步使用者定義函式:
void MyAsyncUDF(LPXLOPER12 arg1, LPXLOPER12 pxAsyncHandle)
{
…
}
傳回值
當異步呼叫的結果準備就緒時,XLL 載入宏會執行 xlAsyncReturn 類型的回呼,將結果傳回 Excel。
xlAsyncReturn 是您在重新計算期間,唯一可以在非計算線程上使用的回呼。 因此,異步 UDF 的異步部分不應該執行任何其他回呼。
處理事件
從 Excel 2010 開始,XLL 可以接收設計來管理異步函式生命週期的事件。 如需詳細資訊,請 參閱處理事件。