Asynchrone benutzerdefinierte Funktionen
Gilt für: Excel 2013 | Office 2013 | Visual Studio
Microsoft Excel 2013 können benutzerdefinierte Funktionen asynchron aufrufen. Das asynchrone Aufrufen von Funktionen kann die Leistung verbessern, indem mehrere Berechnungen gleichzeitig ausgeführt werden können. Wenn Sie benutzerdefinierte Funktionen in einem Computecluster ausführen, können dank asynchroner Funktionsaufrufe mehrere Computer für die Durchführung von Berechnungen verwendet werden.
Verwendung asynchroner benutzerdefinierter Funktionen
Einige benutzerdefinierte Funktionen müssen auf externe Ressourcen warten. Während sie warten, wird der Excel-Berechnungsthread blockiert. In Excel 2013 können benutzerdefinierte Funktionen asynchron ausgeführt werden. Dadurch wird der Berechnungsthread freigegeben, um andere Berechnungen auszuführen, während die benutzerdefinierte Funktion wartet.
In Excel 2007 können Programmierer mehrere benutzerdefinierte Funktionen gleichzeitig ausführen, indem sie die Anzahl der Threads erhöhen, die bei Neuberechnungen mit mehreren Threads verwendet werden. Diese Methode hat in erster Linie Nachteile, da die Anzahl der Threads eine Einstellung ist, die auf eine Anwendung festgelegt ist und nicht auf der Ebene einer einzelnen Funktion oder eines Add-Ins gesteuert werden kann.
Programmierer sollten asynchrone benutzerdefinierte Funktionsaufrufe verwenden, wenn die Funktion auf externe Ressourcen warten muss. Beispielsweise muss eine Funktion, die eine SOAP-Anforderung über das Internet sendet, warten, bis das Netzwerk die Anforderung übermittelt, der Remoteserver die Anforderung abgeschlossen hat und das Netzwerk das Ergebnis zurückgibt. In diesem Fall erfolgt keine wesentliche Berechnung, und Excel kann mit anderen Berechnungen fortfahren.
Programmierer können auch asynchrone benutzerdefinierte Funktionen verwenden, wenn eine Funktion Anforderungen an einen Computecluster sendet. In diesem Fall muss nicht nur auf die Netzwerklatenz gewartet werden, sondern der Cluster kann separate Aufrufe auf separaten Servern ausführen. Wenn sie nicht auf den Abschluss jedes Anrufs warten, können sich die Aufrufe überlappen, um die Leistung zu verbessern. In einigen Fällen ist diese Verbesserung erheblich.
Hinweis
Benutzerdefinierte Funktionen können nicht sowohl als asynchron als auch als clustersicher registriert werden.
Schreiben einer asynchronen benutzerdefinierten Funktion
Asynchrone benutzerdefinierte Funktionen müssen ein Handle nachverfolgen und dieses Handle verwenden, wenn Sie Excel darüber informieren, dass der Funktionsaufruf abgeschlossen ist. Eine asynchrone benutzerdefinierte Funktion wird in zwei Teile aufgeteilt. Der erste Teil ist der UDF-Standardeinstiegspunkt, der einen zweiten, separaten asynchronen Vorgang startet. Rückrufe in Excel sollten während des UDF-Einstiegspunkts erfolgen. Der erste startende Teil der Funktion gibt dann die Steuerung des Berechnungsthreads an Excel zurück, wodurch die Berechnung fortgesetzt wird. Wenn der zweite asynchrone Vorgang abgeschlossen ist, muss er Excel zurückrufen und das Ergebnis für Excel bereitstellen.
Hinweis
Alle an die UDF übergebenen Argumente, die vom asynchronen Teil der Funktion benötigt werden, müssen tief kopiert werden, da Excel diese Argumente freigibt, wenn der UDF-Einstiegspunkt zurückgibt.
Excel stellt eine Reihe von Ereignissen bereit, die ein XLL-Add-In verwenden kann, um den Lebenszyklus asynchroner UDF-Aufrufe zu verwalten. Diese Ereignisse geben an, dass Excel mit Berechnungen abgeschlossen ist oder dass die Berechnung abgebrochen wurde.
Deklarieren einer asynchronen Funktion
Sie müssen asynchrone benutzerdefinierte Funktionen als asynchron deklarieren, wenn sie registriert werden. Dies erfolgt durch Hinzufügen eines Parameters, der auf eine XLOPER12-Struktur verweist, die durch "X" in der Registrierungstypzeichenfolge dargestellt wird, an einer beliebigen Stelle in der Liste der UDF-Parameter. Excel verwendet diesen Parameter, um das asynchrone Aufrufhandle zu übergeben. Das XLL-Add-In muss das asynchrone Aufrufhandle und das Ergebnis der Funktion zurück an Excel übergeben, wenn das Ergebnis bereit ist. Darüber hinaus sollte der Rückgabetyp der UDF void sein und durch ">" als erstes Zeichen in der Typzeichenfolge festgelegt werden. Der Rückgabetyp ist void, da der synchrone Teil der UDF keinen Wert an Excel zurückgibt. Stattdessen gibt das XLL-Add-In einen Wert asynchron über einen Rückruf zurück.
Sie können asynchrone Funktionen als threadsicher deklarieren, und dann wird der synchrone Teil der UDF in einer Multithread-Neuberechnung verwendet.
Das folgende Codebeispiel zeigt eine asynchrone benutzerdefinierte Funktion, die mit ">QX" als Registrierungstypzeichenfolge registriert wurde:
void MyAsyncUDF(LPXLOPER12 arg1, LPXLOPER12 pxAsyncHandle)
{
…
}
Zurückgeben von Werten
Wenn das Ergebnis des asynchronen Aufrufs bereit ist, gibt das XLL-Add-In das Ergebnis an Excel zurück, indem es einen Rückruf vom Typ xlAsyncReturn ausführt.
xlAsyncReturn ist der einzige Rückruf, den Sie während der Neuberechnung für Nicht-Berechnungsthreads verwenden können. Daher sollte der asynchrone Teil einer asynchronen UDF keine weiteren Rückrufe ausführen.
Handhabung von Ereignissen
Ab Excel 2010 können XLLs Ereignisse empfangen, die zum Verwalten des asynchronen Funktionslebenszyklus entwickelt wurden. Weitere Informationen finden Sie unter Behandeln von Ereignissen.