ASP.NET Blazor中Mutex与lock在工作线程中同步失效问题求助
ASP.NET Blazor中同步函数互斥执行失效问题
在ASP.NET(Blazor)应用的HTTP请求处理流程中,我调用了一个位于Scoped注入对象中的同步函数(此点与问题无关),该函数可能被异步函数调用,其中部分代码需要互斥执行。
我最初认为实现互斥很简单,编写了如下代码:
using (Mutex mutex = new(true, "SyncObject")) { ... }
本以为命名Mutex能全局阻止多个线程进入代码块,但意外发现多个WorkerThreads进入了该区域。
之后调研了解到.NET同步对象有'Local'和'Global'命名空间,因仅关注'Local'未做修改,尝试改为Global命名空间后仍无效:
using (Mutex mutex = new(true, "Global\\SyncObject")) { ... }
上述代码依旧无法阻止多线程进入。
我曾猜测工作线程可能不是系统线程,导致Mutex始终被授予所有权,但该函数是同步的,单线程需执行完才能重入。随后尝试以下代码:
using (Mutex mutex = new(false, "Global\\SyncObject")) { mutex.WaitOne(); ... mutex.ReleaseMutex(); }
仍然无效。
既然命名Mutex无效,我尝试创建静态对象:
private static Object mutex = new();
并在lock语句中使用:
lock(mutex) {...}
但该方案同样失效。
经排查确认确实是两个不同线程,但为何Mutex与lock都无法实现同步?
内容的提问来源于stack exchange,提问作者Mohammed Lokhandwala
相关产品推荐
相关产品推荐

