You certainly could vary the speed of "virtual threads" independently. We have only begun to investigate the possibilities here. I encourage you to play around with it and see what you can come up with.
ContinueWith is a good idea. In fact, it already exists in Rx and is an overload of SelectMany. The only difference is that the SelectMany can continueWith on OnNext, onCompleted, or OnError. This is the correct overload:
Static/Dynamic would be misleading. Immutable/Mutable is also misleading. Perhaps, the closest terms are Deferred / Not-Deferred or Latent / Active.
The terms Hot and Cold came from whiteboarding and design sessions where we needed a term to describe the difference between something that running versus something that represents a thing that can be run. We definitely didn't sit down and figure out a
vocabulary, these things just happen. I'm sure that at some point in time people will think about standard terminology, but we usually can't wait for that to happen.
Unfortunately, it has nothing to do with Rx. And if you reported it as a VB bug then the VB team would correctly say that it is by design. Which probably means that it is a bug in the user code.
Now, understandably this is a rather confusing bug, and I tend to think that overloading "=" to be either relational equality or assignment leads to some rather interesting cases and so I personally think that VB is rather confusing here.
I tried it out and it seems that the anonymous functions in VB are getting in the way. If you write it without anonymous functions then it works fine. The reason is that assignment is a statement and so cannot be an expression and therefore not in an anonymous
function. Instead, the = becomes the equality operator so each time the interval fires it checks to see if the form's text is equal to the current textual representation of the interval's value: obviously wrong.
Here is the fix:
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Observable.Context = SynchronizationContexts.WindowsForms
Dim xs = Observable.Interval(TimeSpan.FromSeconds(1))
Private Sub Foo(ByVal X As Long)
Me.Text = X.ToString