gpt4 book ai didi

asp.net-mvc - 如何锁定一个 asp.net mvc Action ?

转载 作者:行者123 更新时间:2023-12-03 10:48:50 26 4
gpt4 key购买 nike

我编写了一个 Controller 和操作,我将其用作服务。
这项服务的成本很高。
如果当前已经有一个正在运行的操作,我想限制对此操作的访问。

是否有任何内置方法来锁定 asp.net mvc 操作?

谢谢

最佳答案

你在寻找这样的东西吗?

public MyController : Controller
{
private static object Lock = new object();

public ActionResult MyAction()
{
lock (Lock)
{
// do your costly action here
}
}
}

如果一个线程当前正在处理 lock 中的代码,上述将阻止任何其他线程执行该操作。堵塞。

更新:这是如何工作的

方法代码始终由线程执行。在负载很重的服务器上,可能有 2 个或更多不同的线程进入并开始并行执行一个方法。根据问题,这是您要防止的。

注意 private Lock对象是 static .这意味着它在 Controller 的所有实例之间共享。因此,即使在堆上构造了这个 Controller 的 2 个实例,它们都共享同一个 Lock 对象。 (该对象甚至不必命名为 Lock,您可以将其命名为 Jerry 或 Samantha,它仍然可以起到相同的作用。)

这就是发生的事情。您的处理器一次只能允许 1 个线程输入一段代码。在正常情况下,线程 A 可以开始执行一个代码块,然后线程 B 可以开始执行它。所以理论上你可以让 2 个线程同时执行相同的方法(或任何代码块)。
lock可以使用关键字来防止这种情况。当一个线程进入一个包裹在 lock 中的代码块时部分,它“拾取”锁定对象( lock 关键字后括号中的内容,也称为 LockJerrySamantha ,应标记为 static 字段)。在执行锁定部分的持续时间内,它“保持”锁定对象。当线程退出锁定部分时,它“放弃”锁定对象。从线程获取锁对象的那一刻起,直到它放弃锁对象,所有其他线程都被阻止进入锁定的代码段。实际上,它们被“暂停”,直到当前正在执行的线程放弃锁定对象。

因此,线程 A 在 MyAction 方法的开头获取锁定对象。在它放弃锁对象之前,线程 B 也尝试执行这个方法。但是,它无法获取锁对象,因为它已经被线程 A 持有。所以它等待线程 A 放弃锁对象。当它完成时,线程 B 然后拿起锁对象并开始执行代码块。当线程 B 完成执行该 block 时,它为下一个委托(delegate)处理此方法的线程放弃锁定对象。

...但我不确定这是否是您正在寻找的...

使用这种方法不一定会使您的代码运行得更快。它只确保一个代码块一次只能由 1 个线程执行。它通常用于并发原因,而不是性能原因。如果您可以在问题中提供有关您的特定问题的更多信息,那么可能会有比这个更好的答案。

请记住,我上面介绍的代码会导致其他线程在执行该 block 之前等待。如果这不是您想要的,并且如果它已经被另一个线程执行,并且您希望整个操作被“跳过”,那么请使用更像 Oshry 的答案的东西。您可以将此信息存储在缓存、 session 或任何其他数据存储机制中。

关于asp.net-mvc - 如何锁定一个 asp.net mvc Action ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13901048/

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