Skip to content
Nicolás Seijas edited this page Jul 28, 2026 · 2 revisions

FAQ

When do I use Rambla?

Use Rambla when the state changes more quickly than the UI can show it, and when the intermediate values have no importance. Examples are market data, telemetry, dashboards, monitor applications, game state and applications that a WebSocket drives. Refer to Philosophy.

When do I not use Rambla?

  • Forms and settings pages. The values change one time. Rambla gives only additional cost.
  • Streams in which each value has importance, such as trades, fills and log lines. Rambla removes the intermediate values. Use a queue or a stream.
  • A flush that touches thousands of different properties one time each. Rambla cannot coalesce these mutations. Refer to Benchmarks.

Is Rambla a replacement for CommunityToolkit.Mvvm, ReactiveUI or DynamicData?

No. Use Rambla together with them. Use CommunityToolkit.Mvvm for ObservableObject, ReactiveUI for reactive composition, and DynamicData for change sets. Rambla does only the boundary between the background threads and the UI at a high update rate.

Is one Rambla setter more quick than a usual setter?

No. One Rambla setter is more slow, because it adds synchronization and it marks the property. Rambla is more quick in total, because it does not raise the notifications that the UI cannot show. If the subscriber does no work, the usual setter is more quick. Refer to Benchmarks.

Is BeginUpdate() atomic?

BeginUpdate() gives notification coherence. No observer sees a batch in a partial condition. It does not give state atomicity. A reader on a different thread can see a new Bid together with an old Ask before the batch closes. For state atomicity, publish an immutable object. Refer to Core Semantics.

In which order do the PropertyChanged events occur?

The order is not specified. Rambla notifies each dirty property one time in each flush. Do not write code that needs a specific order.

Which UI frameworks can I use?

WPF (Rambla.Wpf) and Avalonia (Rambla.Avalonia). The core has no UI framework, thus an adapter is only an IStateScheduler. An adapter for WinUI is not available. Refer to the Roadmap.

Which version of .NET do I need?

The core and the Avalonia adapter are netstandard2.0. Thus they operate with many versions of .NET. The WPF adapter is net10.0-windows. The repository builds with .NET 10.

How do I limit the refresh rate?

Put your scheduler in a ThrottlingStateScheduler, or call InstallThrottledAsDefault. RamblaOptions.Default.MaxRefreshRate gives the default limit of 60 flushes in one second. Refer to Schedulers.

What does the [State] generator make?

It makes one observable property for each field that has the attribute. The property uses SetField. The generator removes the first underscore and makes the first letter uppercase (_bid gives Bid). It makes no other member. V1 has no [DependsOn] attribute and no validation. The errors RMB001 to RMB005 show incorrect use.

What does the [StateCommand] generator make?

It makes an AsyncStateCommand, a busy property, an error property and a cancel command. The errors RMB006 to RMB009 show incorrect use. Refer to Async Commands.

Can I read a Rambla collection immediately after a write?

No. A read gives the visible contents, which agree with the notifications that Rambla raised. The new item is in the collection after the next flush. Refer to Collections.

Does the diagnostics package change the behavior?

No. A session is an observer. The notification order, the coalescing, the coherence and the error behavior stay the same. Refer to Diagnostics.

Clone this wiki locally