C#中的静态函数,并发问题

时间:2018-02-20 06:14:48

标签: c# asp.net concurrency static-methods

我的应用程序中有许多静态函数,在我的应用程序中被多次调用。通过增加用户数量,这些功能可能会被多次调用。我只是想知道这些函数是否会产生任何并发问题。我的应用程序中的一些静态函数甚至与Database交互。我确保我的静态函数主要使用局部变量。我的一些静态函数如下。 如果需要进行任何更改,请查看并建议。

public static bool ISValidString(string CheckString)
{
    if (CheckString != null)
        CheckString = CheckString.Trim();
    if (String.IsNullOrEmpty(CheckString) || String.IsNullOrWhiteSpace(CheckString) || CheckString == "-" ||
        CheckString == "NA" || CheckString == "." || CheckString == "--Select--" || CheckString == "0" || CheckString == "0.00" || CheckString == "00")
        return false;
    else
        return true;
}

    public static DataTable ProcessMaster(string Condition, string Master)
    {
        DataTable dt = new DataTable();
        dt = (((DataSet)HttpContext.Current.Application[Master]).Tables[0].Select(Condition).Length>0)
            ? ((DataSet)HttpContext.Current.Application[Master]).Tables[0].Select(Condition).CopyToDataTable()
            : ((DataSet)HttpContext.Current.Application[Master]).Tables[0].Clone();
        return dt;
    }


    private static void GetPayTypes()
    {
        HttpContext.Current.Application["PayTypeMaster"] = DBFactory.GetMasters(null, "GetPayTypes");
    }
    public static DataTable GetPayTypes(string Filter = null, bool ForceRefresh = false)
    {
        if (HttpContext.Current.Application["PayTypeMaster"] == null || ForceRefresh == true)
            GetPayTypes();

        string Condition;
        if (Factory.ISValidString(Filter))
            Condition = "PayTypeID like '%" + Filter + "%' or PayTypeDesc like '%" + Filter + "%'";
        else
            Condition = Filter;
        return Factory.ProcessMaster(Condition, "PayTypeMaster");
    }

    public static DataSet GetMasters(string Filter, string MasterName)
    {
        CompanyParams myparam = new CompanyParams();
        try
        {
            myparam.AddParameter("@TranType", MasterName);
            myparam.AddParameter("@Filter", Filter);
            return CompanyDB.GetData(SPNameMasters, myparam.Params);
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {

        }
    }

2 个答案:

答案 0 :(得分:0)

为什么不使用Monitor或只是在使用特定于应用程序的变量的代码周围锁定语句,并且不希望多个线程同时执行代码。最简单的互斥方式。

答案 1 :(得分:0)

正如@ranjit powar建议的那样,我使用围绕使用特定于应用程序的变量/静态变量的代码的锁定语句来解决问题。请在下面找到程序。当函数使用完全局部变量时,不需要这样做。

            static Object LockMulti = new Object();

            lock (LockMulti)
            {
              -- Application specific variables/Static Variables Code Here
            }

            private static void GetPayTypes()
            {
                lock (LockMulti)
                {
                  HttpContext.Current.Application["PayTypeMaster"] = DBFactory.GetMasters(null, "GetPayTypes");
                }
            }

最好使用HttpContext.Current.Application变量的静态变量。两者都提供相同的功能,但是当您使用静态变量(如易于调试,类型安全等)时,有许多优点,