Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有多线程的集合堆叠ConcurrentQueue_C#_Asp.net_Multithreading - Fatal编程技术网

C# 具有多线程的集合堆叠ConcurrentQueue

C# 具有多线程的集合堆叠ConcurrentQueue,c#,asp.net,multithreading,C#,Asp.net,Multithreading,关于这个话题的许多问题/答案只列出了我发现的几个问题/答案。还有很多 多亏了他们中的许多人,我才想出了一个解决我问题的可能办法。我也可能想得太多了。我有一个api,它需要写入一个文本文件来记录日志。现在,api被调用N次以上,在每次调用期间,它需要记录请求。我不想做的是阻止请求在返回请求的数据之前必须等待要记录的日志。现在,不能仅仅删除日志,因此如果文件当前正在使用,那么它还必须在每个请求上堆叠起来,为此使用ReaderWriterLock。然后,当文件未锁定时,我想写入堆叠的日志 我提出这一点

关于这个话题的许多问题/答案只列出了我发现的几个问题/答案。还有很多

多亏了他们中的许多人,我才想出了一个解决我问题的可能办法。我也可能想得太多了。我有一个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>();

我觉得有些东西不对劲,但我正在努力解决它到底是什么,为了满足这些要求,哪种方法才是最好的方法,并且仍然可以在web场中工作。

在我看来,你应该使用BlockingCollection而不是ConcurrentQueue,下面是一个示例,说明如何将它用作与您尝试做的相同的事情

现在使用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
            }
        }
    }
}

希望这能有所帮助

我已经看过BlockingCollection,觉得有点过分了。我可能错了,所以我再看看。感谢您提供有关模块的信息。默认情况下,BlockingCollection使用ConcurrentQueue作为基础存储。看@TanveerBadar是的,在我看来,你是对的,操纵更好,但你是正确的。