同时具有如此多请求的静态类

时间:2015-06-15 04:54:11

标签: c# class c#-4.0

我创建了一个静态ip和日志类。 ip类找出用户的ip地址和日志类将其记录到文本文件中。 一切工作都很好,但我想知道如果同时有这么多请求会发生什么? 我的意思是这两个类都是静态的,并且基于它导致问题的静态类。 我怎么能管理他们? 这是我的ip类:

    public static class IP
    {
        public static string IP()
        {
            System.Web.HttpContext context = System.Web.HttpContext.Current;

            string ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

            if (!string.IsNullOrEmpty(ipAddress))
            {
                string[] addresses = ipAddress.Split(',');
                if (addresses.Length != 0)
                {
                    return addresses[0];
                }
            }

            return context.Request.ServerVariables["REMOTE_ADDR"];
        }
    }
}

这里是写入文本文件的日志类的一部分:

        private static void WriteLine(string message)
    {
        string filePath = FilePath();
        CreateFile(filePath);
        try
        {
            using (StreamWriter log = File.AppendText(filePath))
                log.WriteLine(message);
        }
        catch (Exception)
        {
            //If can not access to file do nothing
            //throw;
        }
    }

3 个答案:

答案 0 :(得分:1)

由于您的类是静态的,您不会遇到争用问题。您的IP.IP()方法类是纯的(即它不会改变任何状态)并且不包含锁,因此不存在任何争用的可能性。

您可能在WriteLine中遇到问题,因为您可能正在编写与执行工作相同的线程上的日志文件。这意味着文件写入充当锁定,因为任何时候只能进行一次写入。

您想要的是登录队列然后在单独的线程上写入该队列;这是一种典型的生产者 - 消费者模式。

或者你可以避免重新发明轮子并使用现有的日志框架来处理这些事情,例如log4net

答案 1 :(得分:0)

它可以正常工作,因为你没有任何公共变量会被保存在内存中并且每次访问时都会改变。

因此,当方法结束时,变量的范围将完成。 但是如果它们在内存中,它们不会受到有多少用户同时使用它的影响,并且不会有任何混乱。

答案 2 :(得分:0)

Streamwriter的默认值为4kb缓冲区,如果需要可以修改,如下所示:

public StreamWriter(
    Stream stream,
    Encoding encoding,
    int bufferSize
)

很可能,您的计算机(包括磁盘访问)很可能比您的互联网访问速度快得多。