gpt4 book ai didi

c# - 在 try 中使用锁时性能下降

转载 作者:太空狗 更新时间:2023-10-29 18:00:01 25 4
gpt4 key购买 nike

我有一个用于单元测试的 MockHttpListener 回调。我给它加了一把锁,如下所示:

public void HandleRequest(HttpListenerContext context)
{
try
{
lock (m_guard)
{
do something short;
}

do the actual handling (longer)
}
catch (HttpListenerException e)
{
...
}
catch (Exception e)
{
...
}
...
}

我遇到了一个问题,由于我们有“花费太长时间”的标准而导致测试失败(我在添加锁之前的测试中没有遇到这个问题。)

我尝试了很多方法来确定问题,唯一解决问题的方法是在 try block 之外获取锁:

public void HandleRequest(HttpListenerContext context)
{
lock (m_guard)
{
do something short;
}
try
{
do the actual handling (longer)
}
catch (HttpListenerException e)
{
...
}
catch (Exception e)
{
...
}
...
}

就相对于 try block 的锁定位置影响测试完成所需的持续时间而言,行为更改是一致的。

有人知道原因吗?

最佳答案

这听起来像是一个死锁——“做一些简短的事情”代码是否调用了任何本身需要锁的代码?

以下代码按预期工作 - 并不是说​​这是个好主意,但它终止时没有问题。

class Program
{
static void Main(string[] args)
{
Locks.DoStuff(Enumerable.Range(0, 10000).Select(e => 9999 - e).ToList());
}
}

static class Locks
{
public static void DoStuff(List<int> blah)
{
try
{
lock (blah)
{
for (var i = 0; i < blah.Count; i++)
{
blah[i] = 1000 / blah[i];
}
}
}
catch (DivideByZeroException e)
{
Trace.WriteLine("Exception - divided by zero");
}
}
}

关于c# - 在 try 中使用锁时性能下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38116087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com