Mono はいつも C# と Common Language Inftastructure (CLI) 仕様をフォローするための努力を続けているが,時にはそれを追い越してしまうことがある。SIMD のサポートなど .NET との後方互換性のための機能もいくつかあるが,ランタイムサポート方式のコンティニュエーション(Continuation) は Mono 独自のものだ。
コンティニュエーション とは一時的に凍結したスレッドのようなもので,必要ならばスナップショットも取得できる。スタックフレームやローカル変数を格納しているが,本当のスレッドのように実行することはできない。単純な形式の例としては C# の yield 演算子がある。ただし yield はステートマシンを生成するコンパイラのトリックに過ぎず,汎用性のあるコンティニュエーションではない。何をするにせよ,ランタイムによるサポートはほとんど不可欠なのだ。
ランタイムサポートに関する Tomi Valkeinen 氏の研究成果が Mono.Tasklet API である。この API は実際にスタックをキャプチャして,汎用的なコンティニュエーションを実現する。スタックは必要に応じて何度でも復元可能だ。ただしこのコンティニュエーションの形式では,参照はキャプチャできるが,それらが参照するヒープ上のオブジェクトは対象とならない点には注意が必要である。氏はこの API を使用してマイクロスレッディングライブラリを開発した。コンティニュエーションと協調型マルチタスクによって単一の物理スレッドを共有する軽量スレッドで構成されている。
先に "ほとんど不可欠" と書いたのには理由がある。汎用的なコンティニュエーション構築にはもうひとつ,別の手段があるのだ。LindenLabs の Jim Purbrick 氏は,ランタイムサポートに代えて CIL リライティングを使用するコンティニュエーション を開発した。Valkeinen 氏の実装に比較すると,コンティニュエーション構築としては比較的重い方法ではあるが,スタックだけでなくヒープ上のオブジェクトもシリアライズが可能な利点がある。これによってコンティニュエーションを別のサーバに復元することも可能となる。Second Life のスケーラブルなアーキテクチャにとって,この点は非常に重要だ。将来的に LindenLabs ではこの2つの技術を組み合わせて,迅速なコンティニュエーションには Mono の Tasklet を,シリアライズが必要な場合には自社の技術を用いたいと考えている。