相关疑难解决方法(0)

为什么锁(这个){...}不好?

MSDN文档说,

public class SomeObject
{
  public void SomeOperation()
  {
    lock(this)
    {
      //Access instance variables
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果可以公开访问实例,那就是"一个问题".我想知道为什么?是因为锁定的持有时间超过了必要的时间吗?还是有一些更阴险的原因?

c# multithreading locking

462
推荐指数
6
解决办法
15万
查看次数

您将如何使用Java或C#编写高效的循环缓冲区?

我想要一个实现固定大小循环缓冲区的简单类.它应该是高效的,容易在眼睛上,一般打字.

编辑:目前它不需要具备MT功能.我总是可以在以后添加一个锁,在任何情况下它都不会是高并发性的.

方法应该是:.Add和我猜.List,我检索所有条目.第二个想法,我认为应该通过索引器完成检索.在任何时候,我都希望能够通过索引检索缓冲区中的任何元素.但请记住,从一个时刻到下一个Element [n]可能会有所不同,因为循环缓冲区填满并翻转.

这不是一个堆栈,它是一个循环缓冲区.关于"溢出":我希望内部会有一个包含项目的数组,随着时间的推移,缓冲区的头部和尾部将围绕该固定数组旋转.但这应该是用户不可见的.应该没有外部可检测的"溢出"事件或行为.

这不是学校作业 - 它通常用于MRU缓存或固定大小的事务或事件日志.

c# java class-design

43
推荐指数
3
解决办法
7万
查看次数

具有固定大小FIFO队列的生产者/消费者模式

我需要在固定大小的FIFO队列周围实现生产者/消费者模式.我认为围绕ConcurrentQueue的包装类可能适用于此,但我不完全确定(我之前从未使用过ConcurrentQueue).这种扭曲是队列只需要保存固定数量的项目(在我的例子中是字符串).我的应用程序将有一个生产者任务/线程和一个消费者任务/线程.当我的消费者任务运行时,它需要在那个时刻出现队列中存在的所有项目并对其进行处理.

对于它的价值,我的消费者处理排队的项目只不过是通过SOAP将它们上传到一个不是100%可靠的网络应用程序.如果无法建立连接或调用SOAP调用失败,我应该丢弃这些项目并返回队列以获取更多信息.由于SOAP的开销,我试图最大化队列中可以在一次SOAP调用中发送的项目数.

有时,我的制作人可能会比我的消费者能够删除和处理它们更快地添加项目.如果队列已满并且我的生产者需要添加另一个项目,我需要将新项目排队,然后将最旧的项目出列,以便队列的大小保持固定.基本上,我需要始终保留队列中生成的最新项目(即使这意味着某些项目不会被消耗,因为我的消费者当前正在处理以前的项目).

关于生产者如果队列中的项目是固定的那样保留数字,我从这个问题中发现了一个潜在的想法:

固定大小队列,在新的enques上自动将旧值出列

我目前在ConcurrentQueue周围使用一个包装类(基于该答案)和Enqueue()方法,如下所示:

public class FixedSizeQueue<T>
{
    readonly ConcurrentQueue<T> queue = new ConcurrentQueue<T>();

    public int Size { get; private set; }

    public FixedSizeQueue(int size)
    {
        Size = size;
    }

    public void Enqueue(T obj)
    {
        // add item to the queue
        queue.Enqueue(obj);

        lock (this) // lock queue so that queue.Count is reliable
        {
            while (queue.Count > Size) // if queue count > max queue size, then dequeue an item
            {
                T objOut;
                queue.TryDequeue(out objOut);
            }
        } …
Run Code Online (Sandbox Code Playgroud)

.net c# queue producer-consumer concurrent-collections

6
推荐指数
2
解决办法
4188
查看次数

不断增长的固定容量通用序列的最佳选择

我试图在 .NET 缓存中保留内存中的条目列表,代表对我的应用程序的最后 N 个 HTTP 请求。为此使用的最佳 .NET 序列是什么?

要求

  • 固定数量的项目(例如 50)
  • 可序列化(需要将序列添加到.NET缓存)
  • 当我尝试添加 max+1 条目时,它会自动删除最旧的项目以腾出空间
  • 不太关心项目的顺序
  • 需要能够在单个操作中获取所有项目,以便执行聚合计算。
  • 线程安全
  • 非唯一(例如List<T>、 not Dictionary<TKey,TValue>)。我可能会点击 URL /foo10 次,这不是唯一的,但所有内容都需要添加到序列中。

我突然想到我可以使用 a Queue<T>,在排队时只需检查长度,如果达到容量,则将旧的出队。但担心线程安全(ConcurrentQueue<T>也许?)和最佳方法,因为这是我的应用程序的“热门”区域,需要优化。

谢谢!

.net c# sequences

5
推荐指数
1
解决办法
648
查看次数

读取文本文件的前一行; 如果当前行包含"X"

目前,我正在读取特定条目"X"的文件.一旦我找到这个条目,我可以在任何后续行中做我需要做的事情但是在"X"出现之前有一条信息需要2行.现在我可以使用var line = reader.ReadLine();在文件中前进并读取"X"之后的行.我如何回过头来读取2行数据?

while (!reader.EndOfStream)
{
    var line = reader.ReadLine();

    if (line.Contains("X"))
    {
        Processing
    }
}
Run Code Online (Sandbox Code Playgroud)

c# streamreader text-files

3
推荐指数
1
解决办法
1537
查看次数

具有自动删除项目的 c# 集合

可能的重复:
固定大小的队列,它会在新的队列中自动将旧值出列

是否有一个集合会在添加新项目时自动删除旧项目?假设我有一个限制为十个项目的列表。添加第十一项后,删除第一项,容量仍为十。好像会有这样的东西,但是我找不到。有任何想法吗?

c# collections

2
推荐指数
1
解决办法
3817
查看次数

从 System.IO.StringWriter 中删除一行

我有一段代码将文本行添加到 System.IO.StringWriter。

当它超过一定大小时,我想从头开始清除行。

我怎么做?可以做到吗?

System.IO.StringWriter log = new System.IO.StringWriter();
log.WriteLine("some text");
log.WriteLine("more text");

// some how remove the first line ????
Run Code Online (Sandbox Code Playgroud)

c#

0
推荐指数
1
解决办法
303
查看次数