Ich habe eine Klasse,
%Vor%erfordert, dass alle Aufrufe von Calc für denselben Thread ausgeführt werden, für den Test erstellt wurde. Ich muss Test einmal (kostspieliger Betrieb) verursachen und Calc mehrfach anrufen.
Ich hätte gerne einen Wrapper, mit dem ich Calc asynchron aufrufen kann:
%Vor%Eine Möglichkeit besteht darin, einen BackgroundWorker oder einen Thread zu erstellen und ihn als Garantie dafür zu verwenden, dass alle Vorgänge in Test sich im selben Thread befinden. Der Einfachheit halber können wir davon ausgehen, dass alle Aufrufe von Calc () sequenziell ausgeführt werden, sodass Sie sich keine Gedanken über Warteschlangen machen müssen.
Gibt es einen eleganteren RX-Weg, es zu tun?
Wenn es möglich ist, dass Test
erstellt wird, wenn TestWrapper
erstellt wird, dann scheint diese Klasse Ihre Anforderungen zu erfüllen:
Es wird so verwendet:
%Vor% Ich habe es getestet und es erstellt Test
für denselben Thread, auf dem Calc
ausgeführt wird. Die Subskription hingegen wird in demselben Thread behandelt, in dem testWrapper
selbst erstellt wurde (d. H. Der aufrufende Thread).
Also von Kommentaren und erneutes Lesen Ihrer Frage Ich nehme an, Sie möchten Calc () immer wieder auf einem konstanten Thread aufrufen und die Rückgabeergebnisse als IObservable<Int>()
?
In diesem Fall würde ich Observable.Create
verwenden, um die Klasse Test
und EventLoopScheduler
zu umbrechen, um sicherzustellen, dass die Aufrufe von Calc in einem einzelnen Thread erfolgen.
Verwenden Sie die Klasse ThreadLocal<T>
, wenn Sie Ihre Instanz von Test
erstellen:
Dann können Sie MyTEST.Value.Calc ()
für alle Anrufe verwenden ...
Eine weitere Option ist die Verwendung von put [ThreadStatic]
auf dem Test-Member der Wrapper-Klasse ...
siehe Ссылка
Je nachdem, ob Sie mehr als eine Instanz von Test
benötigen, können Sie es zu einem Singleton machen.
Tags und Links c# system.reactive