【发布时间】:2017-07-24 15:46:31
【问题描述】:
关于这个主题的问题/答案不少(仅列出我找到的几个。还有更多)。
- C# Parallel - Adding items to the collection being iterated over, or equivalent?
- ConcurrentQueue with multithreading
感谢他们中的许多人,我想出了一个我希望能解决我的问题的方法。我也可能想多了。我有一个需要写入文本文件以进行日志记录的 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);
}
}
}
Logs 是一个像这样的全局变量
private static ConcurrentQueue<string> logs = new ConcurrentQueue<string>();
我觉得有些地方不对劲,但我正在为它是什么而苦苦挣扎,这将是满足要求并仍然在网络农场中工作的最佳方式。
【问题讨论】:
标签: c# asp.net multithreading