Wir haben festgestellt, dass Sie .NET 4.0 verwenden, so dass SemaphoreSlim
das Fenster ausgeht.
Zuerst würde ich versuchen, um das Problem immer durch eine Instanz von SpeechSynthesizer
teilen und SpeakAsyncCancelAll
zu verwenden, wenn eine neue Anforderung kommt:
Private SpeechSynthesizer As New SpeechSynthesizer
Private Sub NewRecallLabel_TextChanged(sender As Object, e As EventArgs)
Dim myrecalllabel As Label = TryCast(sender, Label)
SpeechSynthesizer.SpeakAsyncCancelAll()
SpeechSynthesizer.SpeakAsync("Ticket number " & TTSTicket & ", please proceed to counter " & TTSCounter)
End Sub
oringinal antworten
Da Sie nicht verwenden können, SyncLock
in einem asynchronen Kontext und Sie wollen nicht-blockierende Ausführung, Ihre beste Wette ist es, eine SemaphoreSlim(1, 1)
zu verwenden, um asynchrone Mutex-Semantik zu erhalten (ähnlich wie @Gubr vorgeschlagen, außer async):
Private Semaphore As New SemaphoreSlim(1, 1)
Private Sub NewRecallLabel_TextChanged(sender As Object, e As EventArgs)
Dim myrecalllabel As Label = TryCast(sender, Label)
Dim SpeechSynthesizer As New SpeechSynthesizer
Await Semaphore.WaitAsync()
Try
' We're inside the protected region now.
Await SpeechSynthesizer.SpeakAsync("Ticket number " & TTSTicket & ", please proceed to counter " & TTSCounter)
Finally
Semaphore.Release()
End Try
End Sub
ich auch Verdrahtung in irgendeiner Form der Drosselung betrachten würde und/oder Auto-Löschung, da der Code, wie es will steht nicht Arbeit sehr gut, wenn die Beschriftung schnell ändert (d Jede weitere Sprachanfrage muss auf die vorherigen Sprachanforderungen warten.
möglicherweise dasselbe wie [dies] (http://stackoverflow.com/questions/17419961/c-sharp-threadpool-queueuserworkitem-use) – carlot0820
Welche .NET-Version zielen Sie ab? –
Ich ziele auf .NET v4 Sir. – carlot0820