System.Threading.Timer in Excel-Add-In verhindert Excel Shutdown

15/02/2008 - 17:15 von AndreasU | Report spam
Ich programmiere ein SharedAddIn für Excel in VB.NET2005.
Ich verwende für eine Funktion einen Timer aus dem Namespace
System.Threading. Wenn ich diesen Timer verwende,wird die Excel-Instanz beim
Beenden von Excel nicht mehr beendet. Die Exceloberflàche verschindet, die
Instanz bleibt aktiv mit 0% Prozessorlast.

In der MSDN Library steht folgendes:

Geben Sie mit einem TimerCallback-Delegaten die Methode an, die der Timer
ausführen soll. Der Zeitgeberdelegat wird bei der Erstellung des Zeitgebers
angegeben und kann nicht geàndert werden. Die Methode wird nicht in dem
Thread ausgeführt, der den Zeitgeber erstellt hat, sondern in einem vom
System bereitgestellten ThreadPool-Thread.

Ich denke, Excel wird nicht beendet, weil der Zeitgeberdelegat in dem
ThreadPool ausgeführt wird.

Ich habe den Timer aus System.Threading verwendet, weil ich das Excel auch
ohne GUI ausführen will. Es soll auch im Hintergrund ohne GUI arbeiten.
Deshalb ist ein Timer ohne GUI Interface notwendig.

Ich achte darauf, daß ich die Timerressourcen mit Dispose() freigebe. Und
hier der wichtigste Quellode:

Timer anlegen:
Imports System
Imports System.Threading

Dim objEvent As New AutoResetEvent(False)
Dim objDelegate As Threading.TimerCallback = AddressOf FireTick2

objTimer = New Timer(objDelegate, objEvent, lDelay, lDelay)

Timer beenden:
objTimer.Change(0, Timeout.Infinite)
objTimer.Dispose()


Wie kann ich erreichen, daß auch der Zeitgeberdelegat im Threadpool
freigegeben wird? Gibts andere Timer die ich verwenden könnte?

Dieser Timer tuts leider nicht:
Private Declare Function CreateWindowEx Lib "user32" Alias
"CreateWindowExA" (ByVal dwExStyle As Integer, ByVal lpClassName As String,
ByVal lpWindowName As String, ByVal dwStyle As Integer, ByVal x As Integer,
ByVal y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal
hWndParent As Integer, ByVal hMenu As Integer, ByVal hInstance As Integer,
ByRef lpParam As Integer) As Integer
lHWnd = CreateWindowEx(0, "STATIC", "MMTimerWindow", WS_OVERLAPPED Or
WS_MINIMIZE, 0, 0, 10, 10, 0, 0, 0, 0)

Er hat eine GUI und ist damit für meinen Hintergrundmodus nicht brauchbar.

Der Timer aus System.Timer tuts auch nicht, den habe ich testweise probiert.

Für Tipps wàre ich dankbar.

Andreas Ulbricht


-
XXL-Pizza: Der Schnelle Weg zu Ihrer Pizza
http://www.xxl-pizza.de
 

Lesen sie die antworten

#1 Peter Götz
15/02/2008 - 17:51 | Warnen spam
Hallo Andreas,
Timer beenden:
objTimer.Change(0, Timeout.Infinite)



Das sollte zum Beenden so aussehen:

objTimer.Change(Timeout.Infinite, Timeout.Infinite)

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen