使用多线程堆叠ConcurrentQueue的集合

时间:2017-07-24 15:46:31

标签: c# asp.net multithreading

关于这个主题的几个问题/答案(仅列出我发现的一对。还有更多)。

  1. C# Parallel - Adding items to the collection being iterated over, or equivalent?
  2. ConcurrentQueue with multithreading
  3. 感谢他们中的许多人,我想出了我希望能解决我问题的方法。我也可能是在思考它。我有一个api需要写入文本文件以进行日志记录。现在api被称为N +次,并且在每次调用期间,它需要记录请求。我不想做的是停止请求在返回所请求的数据之前必须等待记录日志。现在,日志不能只是被丢弃,因此如果文件当前正在使用,它必须也堆叠在每个请求上,使用ReaderWriterLock。然后,当文件没有被锁定时,我想写堆积的日志。

    我已经想到它会满足要求,但我认为它仍会导致等待。

    var wid = WindowsIdentity.GetCurrent().Token;
    //add new log items
    logs.Enqueue(helpers.createNewLog(requests));
    string op;
    while (logs.TryDequeue(out op))
    {
        using (WindowsIdentity.Impersonate(wid))
        {
            //write to text file, location on shared drive
            var wrote = writers.WriteLog(op);
            //item cannot be written since file locked, add back to queue to try again
            if (!wrote)
            {
                logs.Enqueue(op);
            }
        }
     }
    

    日志是全球性的

    private static ConcurrentQueue<string> logs = new ConcurrentQueue<string>();
    

    我觉得有些事情是对的,但我正在努力解决这个问题,这将是满足要求并在网络服务器场中工作的最佳方式。

1 个答案:

答案 0 :(得分:1)

在我看来,你应该使用BlockingCollection而不是ConcurrentQueue,这里有一个如何使用它作为Producer-Consumer的例子,你正在尝试做同样的事情。

现在使用ASP.Net可以插入模块来拦截每个请求,如果你想保存日志,我建议你注册一个模块,而不是按照你的方法。在Global.asax.cs上有一个Register方法

public class MvcApplication : System.Web.HttpApplication
{
    public static void Register()
    {
        //registering an HttpModule
        HttpApplication.RegisterModule(typeof(LogModule));
    }

    ....
}


public class LogModule: IHttpModule
{
    public void Dispose()
    {

    }

    public void Init(HttpApplication context)
    {
        context.LogRequest += LogEvent;
    }

    private void LogEvent(object src, EventArgs args)
    {
        if (HttpContext.Current.CurrentNotification == RequestNotification.LogRequest)
        {
            if ((MvcHandler)HttpContext.Current.Handler != null)
            {
                Debug.WriteLine("This was logged!");
                //Save the information to your file
            }
        }
    }
}

希望这有帮助