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

推荐订阅源

量子位
Stack Overflow Blog
Stack Overflow Blog
人人都是产品经理
人人都是产品经理
The GitHub Blog
The GitHub Blog
Engineering at Meta
Engineering at Meta
Vercel News
Vercel News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Y
Y Combinator Blog
The Cloudflare Blog
Last Week in AI
Last Week in AI
B
Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
V
Visual Studio Blog
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
Google DeepMind News
Google DeepMind News
D
DataBreaches.Net
博客园 - 司徒正美
B
Blog RSS Feed
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
L
LangChain 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();
    }
}