Erstellen Sie einen beobachtbaren Wrapper für eine nicht Thread-sichere Klasse

8

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?

    
Sergey Aldoukhov 15.08.2011, 21:40
quelle

3 Antworten

4

Wenn es möglich ist, dass Test erstellt wird, wenn TestWrapper erstellt wird, dann scheint diese Klasse Ihre Anforderungen zu erfüllen:

%Vor%

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).

    
Enigmativity 16.08.2011, 02:35
quelle
3

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>() ?

zur Verfügung stellen

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.

%Vor%     
Scott Weinstein 15.08.2011 23:08
quelle
0

Verwenden Sie die Klasse ThreadLocal<T> , wenn Sie Ihre Instanz von Test erstellen:

%Vor%

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.

    
Yahia 15.08.2011 22:25
quelle

Tags und Links