4

使用 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))
{ ... }

但是现在这个调用无限期地阻塞了。

这是一个错误吗?或者

在什么情况下调用会阻塞?

Cheerio,安德烈亚斯。

4

1 回答 1

3

@Andreas Hassmann,我遇到了类似的问题,所以我猜你的问题可能是由...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.");
于 2017-03-31T10:35:09.400 回答