2017-03-05 4 views
3

GraphEngineをしばらく使っていると、GraphEngineに対していくつかの操作をしている間に、スレッドがデッドロックしていることがよくあります。ネストされたコールは、確かにメニューにはありません。GraphEngineのデッドロック

if(Global.LocalStorage.Contains(cellID)) 
{ ... } 

foreach(long cellID ...) 
{ 
    byte[] buffer; 

    // the next line will block on the 54th call... 
    Global.LocalStorage.LoadCell(cellID, out buffer); 
} 

私は電話を包ん非既存のセルIDを疑いしかし、今、このコールブロックindefinitly:しかし、今、私は奇妙な何かに遭遇しました。

これはバグですか?または

コールブロックはどの条件になりますか?

Cheerio、 Andreas。

答えて

3

@Andreas Hassmann、私は同様の問題を抱えていたので、あなたの問題はforeach-loopの...によって引き起こされると思います。

Global.LocalStorage.xxxCell_Accessor_Selector().Select(c => c.CellID.Value)のようなイテレータを使用しました。この場合、記憶装置のロックは解除されていないので、Global.LocalStorage.LoadCell()がロックを取得するとデッドロックが発生します。

問題が鉱山とまったく同じ場合は、.ToList()をイテレータに適用します。

ここに問題を再現するためのコードがあります。

TSL:

cell struct MyCell 
{ 
    int A; 
} 

コード:

for (int i = 0; i < 100; i++) 
{ 
    MyCell mc = new MyCell(i); 
    Global.LocalStorage.SaveMyCell(i, mc); 
} 

var ids = Global.LocalStorage.MyCell_Accessor_Selector().Select(c => c.CellID.Value); 

Console.WriteLine("1 start."); 
foreach (long cellID in ids.ToList()) 
{ 
    byte[] buffer; 
    Global.LocalStorage.LoadCell(cellID, out buffer); 
    Console.WriteLine(cellID); 
} 
Console.WriteLine("1 done."); 

Console.WriteLine("2 start."); 
foreach (long cellID in ids) 
{ 
    byte[] buffer; 
    Global.LocalStorage.LoadCell(cellID, out buffer); 
    Console.WriteLine(cellID); 
} 
Console.WriteLine("2 done."); 
+0

おかげで、L.H.!私はあまりにも遠くに私の質問を略記するために謝罪する必要があります。私のCellIDは、別のCellTypeを反復処理したもので、LoadCellは最初の呼び出しではなく、54番目の呼び出しでブロックされました。だからこそ私は不規則性を疑った。しかし、はい、私はToList()もそれを回避しました。しかし、これは、存在する場合には、トリニティ内の巧妙な反復子の実装を無用にします。 –

+0

@AndreasHassmann私はあなたが望むものを見て、私が見つけた別の解決策があります:イテレータ内のデータを更新しない場合、トリニティストレージを '読み取り専用'モードに設定するだけで、ロック。私の解決策は、最初にストレージを初期化し、ストレージをディスクに保存してから、ロードをロードしてストレージを反復する前に次のコードを入れます。 'TrinityConfig.CurrentRunningMode = RunningMode.Embedded; TrinityConfig.ReadOnly = true; Global.LocalStorage.LoadStorage(); ' –

+0

もう一度お返事ありがとうございます。これは実行時に切り替えることができないかのようです私はデータベースに再接続する必要があります。あなたは梁氏ですか?トリニティについて一般的に、それを構築した人とここでは公共空間でぶつかることなく話したいと思っています... –

関連する問題