gpt4 book ai didi

c# - 我应该如何在 C# 中编写生产者/消费者代码?

转载 作者:行者123 更新时间:2023-11-30 20:11:35 26 4
gpt4 key购买 nike

我有 1 个线程流数据和第二个(线程池)处理数据。数据处理大约需要 100 毫秒,所以我使用第二个线程,以免占用第一个线程。

当第二个线程处理数据时,第一个线程将数据添加到字典缓存中,然后当第二个线程完成时,它处理缓存的值。

我的问题是应该如何在 C# 中编写生产者/消费者代码?

public delegate void OnValue(ulong value);

public class Runner
{
public event OnValue OnValueEvent;
private readonly IDictionary<string, ulong> _cache = new Dictionary<string, ulong>(StringComparer.InvariantCultureIgnoreCase);
private readonly AutoResetEvent _cachePublisherWaitHandle = new AutoResetEvent(true);

public void Start()
{
for (ulong i = 0; i < 500; i++)
{
DataStreamHandler(i.ToString(), i);
}
}

private void DataStreamHandler(string id, ulong value)
{
_cache[id] = value;

if (_cachePublisherWaitHandle.WaitOne(1))
{
IList<ulong> tempValues = new List<ulong>(_cache.Values);
_cache.Clear();

_cachePublisherWaitHandle.Reset();

ThreadPool.UnsafeQueueUserWorkItem(delegate
{
try
{
foreach (ulong value1 in tempValues)
if (OnValueEvent != null)
OnValueEvent(value1);
}
finally
{
_cachePublisherWaitHandle.Set();
}
}, null);
}
else
{
Console.WriteLine(string.Format("Buffered value: {0}.", value));
}
}
}

class Program
{
static void Main(string[] args)
{
Stopwatch sw = Stopwatch.StartNew();
Runner r = new Runner();
r.OnValueEvent += delegate(ulong x)
{
Console.WriteLine(string.Format("Processed value: {0}.", x));
Thread.Sleep(100);

if(x == 499)
{
sw.Stop();
Console.WriteLine(string.Format("Time: {0}.", sw.ElapsedMilliseconds));
}
};
r.Start();
Console.WriteLine("Done");
Console.ReadLine();
}
}

最佳答案

设置生产者-消费者模式的最佳实践是使用 BlockingCollection .NET 4.0 中可用的类或作为 Reactive Extensions 的单独下载框架。这个想法是,生产者将使用 Add 方法入队,而消费者将使用 Take 方法出队,如果队列为空,该方法将阻塞。喜欢SwDevMan81指出 Albahari 站点有一篇非常好的文章,介绍了如果您想使用手动路线,如何使其正常工作。

关于c# - 我应该如何在 C# 中编写生产者/消费者代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3629035/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com