LE:クラッシュの問題については、次の未解決のバグを参照してください:バグ566324、バグ580791、バグ602502
私自身はこれにかなり慣れていないので、これまでに収集した情報をここに示します。多分それは役に立つでしょう。
1)Mono.Taskletsライブラリ(Miguel de Icaza [READ:here ]で説明)は、さまざまな形式の継続システムと軽量(LW)スレッドを構築するために使用できる継続ライブラリです。
これを描写する簡単な方法は、Cのlongjmp / setjmpのモノバージョンであり、スタックを巻き戻すためにのみ使用できます。
ライブラリは当初、ある人によって開発されました[READ:here ]、そして今ではMonoに含まれ、文書化されています[READ:here ](これらのリンクをたどると詳細がわかります)
その男は、この抽象化の上にマイクロスレッディングライブラリを実装しました。そして今、それはMono.Taskletsフレームワークに移植されました
2)継続は、現在の実行状態を保存するために使用できるオブジェクトであり、後で保存された状態を復元するために使用できます。
ここでの「実行状態」とは、呼び出しスタックとローカル変数を含むスタック、およびプロセッサのレジスタを意味します。
保存された状態が復元されると、プログラムの実行は、すべてのローカル変数が復元された状態で、状態が保存された位置にジャンプして戻るように見えます。
Cでの例とウィキペディア/継続に関する詳細情報
3)APIは次のとおりです。
public class Continuation {
public Continuation ();
public void Mark ();
public int Store (int state);
public void Restore (int state);
}
継続を使用して、マイクロスレッドを実装できます。Githubで入手可能なMono.MicroThreadsのコードを見ることができます[読む:ここ]
public Continuation()
{
m_handle = alloc_continuation();
Print("Continuation()");
}
public void Mark()
{
Print("Mark()");
// skip 1 frame, ie. this function
mark_continuation_frame(m_handle, 1);
}
public int Store(int data)
{
Print("Store({0})", data);
int res = store_continuation(m_handle, data);
Print("Store({0}) = {1}", data, res);
return res;
}
public void Restore(int data)
{
Print("Restore({0})", data);
restore_continuation(m_handle, data);
Print("Restore() exit (NEVER REACHED)");
}
ここに提示されているものから:
Mark()保存する最上位のフレームをマークするために使用されます
Store(x)は、現在の状態を継続に格納し、指定された整数xを返します。
Restore(y)は保存された状態を復元し、指定された整数yを返します。(Restoreに指定された整数yは、実際にはStore()メソッドから返されることに注意してください。これは、状態が復元された後の場所であるためです。)
static void Main()
{
Continuation c = new Continuation();
c.Mark();
int foo = 123;
int val = c.Store(0);
Console.WriteLine("{0} {1}", val, foo);
foo = 321;
if (val < 5)
c.Restore(val + 1);
}
Store()を呼び出すと、現在の実行状態が記録され、Restore()を呼び出すことでこの状態に戻ることができます。
Store()の呼び出し元は、Storeの結果に基づいて、それが初期ストアであるか復元ポイントであるかを通知します。
var c = new Continuation ();
...
switch (c.Store (0)){
case 0:
// First invocation
case 1:
// Restored from the point ahead.
}
...
// Jump back to the switch statement.
c.Restore (1);