【问题标题】:creating multiple instance of a class in multi thread在多线程中创建一个类的多个实例
【发布时间】:2018-06-29 23:20:07
【问题描述】:

我想知道,如何为每个线程创建单独的类实例。

例如,我有 o 使用线程处理记录集。考虑 1000 条记录和 5 个线程。每个线程应处理 200 条记录并写入 5 个文本文件。第一个线程应该写入file1,第二个线程应该写入file2,依此类推...我如何知道当前正在运行哪个线程以及如何写入正确的文件。 文件处理和数据处理在一个类中,线程调用在另一个类中。如果我创建 5 个线程,每个线程都应该有自己的类。创建第二个线程时,第一个线程将断开连接。也就是说,只有一些数据写入file1,一旦创建第二个文件,它就不会将剩余的数据写入第一个。总是最后一个文件包含所有数据,而其他文件只有很少的记录。

请帮忙。

提前致谢

【问题讨论】:

标签: c# multithreading


【解决方案1】:

您可能需要考虑另一种将工作拆分为线程的方法。类和线程之间没有关联,因此有很多方法可以构建代码以以多线程方式工作,我建议采用如下方法:

// Use a queue to allow the 5 threads to pull the next record
var workItems = new ConcurrentQueue<Record>();

// Add your 1000 Records to workItems queue

// Start 5 workers to process the Records in the queue
Parallel.ForEach(Enumerable.Range(0,5), index =>
{
    // Create a separate file for each thread to work with
    var fileName = string.Format("outputFile_{0}.txt", index);

    using (var outputStream = new StreamWriter(fileName))
    {
        // Dequeue Records from the queue until they're all processed
        while (!workItems.IsEmpty)
        {
            Record record;
            if (workItems.TryDequeue(out record))
            {
                // Process each record and write to the file
                var result = ProcessRecord(record);
                outputStream.Write(result);
            }
        }
    }
})

【讨论】:

  • 嗨 Aaron,感谢您的建议。您已经给出了使用线程将输出写入文件的解决方案,但我们的场景是,我必须在线程中处理这 1000 条记录(最多 5 条)。每条记录都必须在数据库中的多个表中获取信息。意思是说“我想使用线程处理记录,一旦处理完毕,输出应立即写入相应的文本文件”
  • 是的,我的建议本质上是Producer-Consumer Pattern,在那里您将拥有固定数量的生产者线程(例如 1 个)来获取数据并将要处理的记录添加到队列中,然后让一些消费者线程(比如 5 个)将记录出列并处理它们。
  • 我让它与多线程一起工作。目前我面临一个问题,所有线程最多可以工作 30 条记录。超过 30 条记录时,它会随机写入或留下一些记录,或者有时在两个文件中写入相同的记录。任何想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-20
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
  • 1970-01-01
相关资源
最近更新 更多