Тупики в GraphEngine

Работая с GraphEngine некоторое время, я очень часто оказываюсь в тупиковом потоке, выполняя некоторые операции с GraphEngine. Вложенных звонков точно нет в меню. Но теперь я столкнулся с чем-то странным:

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

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

Заподозрив несуществующий cellID, я обернул вызов

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

Но сейчас этот вызов блокируется на неопределенный срок.

Это ошибка? или же

При каких условиях вызов будет заблокирован?

Привет, Андреас.

1 ответ

Решение

@ Андреас Хассманн, я встречал похожую проблему, так что я думаю, что ваша проблема может быть вызвана ... в цикле foreach.

Я использовал итератор как 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.");
Другие вопросы по тегам