防止多次运行服务器端方法

时间:2012-06-20 08:20:13

标签: c# asp.net semaphore

我有一个带有按钮的网页,该按钮可以进行回发,连接到外部数据库以下载一些数据并执行一些数据库更新。我遇到的问题是两个或更多人同时运行此下载或该功能仍在运行时可能会导致问题。

如何创建某种形式的信号量,以便如果第二个人点击该按钮,他会收到一条消息,说明它当前正在更新?

2 个答案:

答案 0 :(得分:2)

在外部数据库上使用正确的事务,并根据需要在其中应用行锁定;数据库系统应该很好地处理并发。

答案 1 :(得分:0)

乍一看,我会使用一个封闭在lock语句中的ASP.NET Application变量来检查并在需要时更新它。

protected void Page_Load(object sender, EventArgs e)
{
    if (!GetSem_SomeoneIsDownloading())
    {
        PerformDownload();
        ClearSem_SomeoneIsDownloading();
    }
    else
    {
        DisplayMessageSomeoneIsDownloadingAlready();
    }
}

bool GetSem_SomeoneIsDownloading()
{
    bool isSomeoneDownloading;
    Application.Lock();

    isSomeoneDownloading = (bool)(Application["SomeoneIsDownloading"] ?? false);
    if (!isSomeoneDownloading)
        Application["SomeoneIsDownloading"] = true;

    Application.UnLock();
    return isSomeoneDownloading;
}

void ClearSem_SomeoneIsDownloading()
{
    Application.Lock();
    Application["SomeoneIsDownloading"] = false;
    Application.UnLock();
}