Тупики в 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.");