C#异步编程:防止控制器方法重复调用

在Web开发中,有时我们需要确保控制器方法在同一时间只被执行一次,以避免并发问题。C#异步编程结合SemaphoreSlim对象提供了一个优雅的解决方案。

以下代码示例演示了如何使用SemaphoreSlim来防止控制器方法被多次调用:csharppublic class MyController : Controller{ private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1);

public async Task<IActionResult> MyAction()    {        await _semaphore.WaitAsync();

    try        {            // 执行需要互斥的代码            await Task.Delay(1000); // 模拟耗时操作            return Ok();        }        finally        {            _semaphore.Release();        }    }}

代码解释:

  1. SemaphoreSlim 对象: 我们创建了一个 SemaphoreSlim 对象,并将其初始化为 1。这意味着同一时间只允许一个线程访问受保护的代码块。

  2. WaitAsync() 方法: 当控制器方法被调用时,我们首先调用 WaitAsync() 方法尝试获取信号量。 * 如果获取成功,代码将继续执行,进入受保护的代码块。 * 如果获取失败(例如,另一个线程已经持有信号量),则该线程将被阻塞,直到信号量被释放。

  3. try...finally 块: 我们使用 try...finally 块来确保即使在代码执行过程中发生异常,SemaphoreSlim 也会被正确释放。

  4. Release() 方法: 在代码执行完毕后,我们调用 Release() 方法释放信号量,允许其他线程获取信号量并执行受保护的代码。

优势:

  • 防止并发问题: 通过确保一次只有一个线程执行关键代码,可以避免数据竞争和不一致状态。* 提高性能: 使用异步编程,即使某个请求被阻塞等待信号量,其他请求仍然可以继续处理,从而提高应用程序的整体吞吐量。

总结:

使用 SemaphoreSlim 对象结合C#异步编程,可以有效地防止控制器方法被多次调用,并提高应用程序的可靠性和性能。

C#异步编程:防止控制器方法重复调用

原文地址: https://www.cveoy.top/t/topic/f1uO 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录