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

推荐订阅源

S
SegmentFault 最新的问题
博客园 - 三生石上(FineUI控件)
爱范儿
爱范儿
博客园 - 聂微东
V
Visual Studio Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
M
MIT News - Artificial intelligence
The GitHub Blog
The GitHub Blog
Recent Announcements
Recent Announcements
有赞技术团队
有赞技术团队
L
LangChain Blog
I
InfoQ
T
Tailwind CSS Blog
博客园 - 【当耐特】
V
V2EX
博客园_首页
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
GbyAI
GbyAI
Vercel News
Vercel News
雷峰网
雷峰网
量子位
A
About on SuperTechFans
Martin Fowler
Martin Fowler
H
Help Net Security

博客园 - 空明流光

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();
    }
}