惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
爱范儿
爱范儿
J
Java Code Geeks
L
LangChain Blog
V
V2EX
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
博客园 - Franky
Microsoft Azure Blog
Microsoft Azure Blog
Jina AI
Jina AI
Blog — PlanetScale
Blog — PlanetScale
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Cloudflare Blog
博客园 - 司徒正美
B
Blog
G
Google Developers Blog
Stack Overflow Blog
Stack Overflow Blog
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
Engineering at Meta
Engineering at Meta
MyScale Blog
MyScale Blog
有赞技术团队
有赞技术团队
Hugging Face - Blog
Hugging Face - Blog

博客园 - 空明流光

c# 正则替换与代码动态替换 正则断言备忘 c# await 异步编程工具类 windows 上 使用 conda 以 指定环境 启动 自定义程序 WPF 数据绑定通过 ElementName 失效后改为 Reference 正常 c# 获取当前时间 与跨域 iframe 通信示例 svn 忽略选项还原 android 应用分身无限多开,开源免费应用 使用 chrome 调试 android webview 前端 dom script C# 文件同步写入锁定 sql server 折腾时不小心去掉了 sysadmin 权限 sqlcipher/sqlite 加解密 Xamarin Android 动态修改菜单颜色 XABLD7000: Xamarin.Tools.Zip.ZipException: Renaming temporary file failed: Permission denied .net8 项目指定包还原位置和读取位置以便备份依赖项 wpf 访问内置资源 C# UTF-8 各种编码比较 vs2022 wpf 无法识别 xaml 中定义的控件名称 wpf 使用 cursor 命令 wpf datagrid 过滤数据两种方式?
wpf 中显示约束只创建一个窗口实例
空明流光 · 2025-09-15 · via 博客园 - 空明流光

wpf 做了一个软件锁定功能, 因有文件关联事件,菜单事件和按钮单击事件都可能导致需要显示密码验证,为了避免显示多个实现,我开始使用了如下代码,肯定是没成功,怀疑是多线程原因导致:

private static bool loginShowing = false;
private static readonly object loginLock = new object(); // 静态锁对象

public static bool? ShowLogin()
{
    lock (loginLock) // 获取锁
    {
        if (loginShowing)
            return false; // 或者 null,取决于你想如何表示“未打开新窗口”
        loginShowing = true;
    } // 释放锁

    try
    {
        var wndLogin = new LoginWindow();
        return wndLogin.ShowDialog();
    }
    finally
    {
        lock (loginLock)
        {
            loginShowing = false;
        }
    }
}

之后经过与 AI 沟通,使用如下代码成功解决了问题:

private static SemaphoreSlim loginSemaphore = new SemaphoreSlim(1, 1);

public static bool? ShowLogin()
{
    if (!loginSemaphore.Wait(100))
    {
        TipHelper.ShowTip("请验证密码!");
        return false;
    }

    try
    {
        var wndLogin = new LoginWindow();
        return wndLogin.ShowDialog();
    }
    finally
    {
        loginSemaphore.Release();
    }
}