gpt4 book ai didi

c# - Monitor.TryEnter 与通用类

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

我有一种情况,为了测试,我只希望我的计时器方法 (FooMethod) 一次运行一个。在下面的示例中,FooMethod 作为委托(delegate)传递给计时器。此类有许多具体实例。我认为通过将 _locker 设为静态,一次只会处理一个 FooMethod() 实例。但是当我运行该应用程序时,多个线程一次通过 TryEnter() 行。

这就是我将每个类添加到新计时器的方式。这是在循环中为每个 foo 实例完成的:

_timers.Add(new Timer(foo.FooMethod, null, 0, 10000));

这是具有该方法的类:

public class Foo<T>
{
private static readonly object _locker = new object();

public void FooMethod(object stateInfo)
{
// Don't let threads back up; just get out
if (!Monitor.TryEnter(_locker)) { return; }

try
{
// Logic here
}
finally
{
Monitor.Exit(_locker);
}
}
}

注意:通常,_locker 不是静态的;我不希望同一个线程在它有机会完成之前进入该方法。我在这里将其更改为静态以进行测试。

我的第一个想法是,这可能不起作用,因为该类是通用的?而且每个具体类实际上都是它自己的类,它们不共享 _locker 变量?真的吗?如果那是真的,我应该如何让具体类共享一个 _locker 变量?我是否需要将静态 _locker 变量添加到 Foos 可以访问的其他类?

最佳答案

Do I need to add a static _locker variable to some other class to which the Foos have access?

是的。

每个关闭Foo<T>类型,不同T参数,有自己的静态 _locker 对象。您可以使 Foo 从基类继承,并将静态对象放在那里。然后,所有类型都将使用相同的实例。

关于c# - Monitor.TryEnter 与通用类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10181113/

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