我有以下代码,我从源中填充用户,例如,如下所示。我想要做的是与多个消费者一起使用 BlockingCollection。
下面是正确的方法吗?最好的线程数是多少?好的,这将取决于硬件、内存等。或者我怎样才能以更好的方式做到这一点?
下面的实现是否会确保我将处理集合中的所有内容,直到它为空?
class Program
{
public static readonly BlockingCollection<User> users = new BlockingCollection<User>();
static void Main(string[] args)
{
for (int i = 0; i < 100000; i++)
{
var u = new User {Id = i, Name = "user " + i};
users.Add(u);
}
Run();
}
static void Run()
{
for (int i = 0; i < 100; i++)
{
Task.Factory.StartNew(Process, TaskCreationOptions.LongRunning);
}
}
static void Process()
{
foreach (var user in users.GetConsumingEnumerable())
{
Console.WriteLine(user.Id);
}
}
}
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}