0

在我的程序中,我收到了一些数据,我必须将其保存到一个文件(一个或多个)中,数据的顺序非常重要,所以它应该像先到先得一样保存。

最后,我收到一个信号,表明此时不再有数据可用,我必须关闭所有打开的文件,我该如何处理它,我的意思是如何确保所有线程都完成了它们的工作,以便,我可以关闭文件。

ManualResetEvent用来控制数据的顺序,所以下一个线程正在等待前一个线程完成它的工作。

以下是我的代码示例,我需要指导以非常有效的方式完成相同类型的工作,以及我如何知道所有线程都已完成工作。

class Program
    {
        static StreamWriter _fileStream;
        static void Main(string[] args)
        {
            _fileStream = File.CreateText(@"D:\HelloThread.txt");               
            ManualResetEvent currentEvent = new ManualResetEvent(true);
            ManualResetEvent nextEvent = new ManualResetEvent(false);              
            int length = 60;
            Data data = null;
            Console.WriteLine("Writing started...");
            for (int i = 0; i < length; i++)
            {
                data = new Data { CurrentEvent = currentEvent, Number = i, NextEvent = nextEvent };
                ThreadPool.QueueUserWorkItem(PrintMsg, data);                   
                currentEvent = nextEvent;
                nextEvent = new ManualResetEvent(false);
            }


            Console.ReadLine();
        }

        private static void CloseAll()
        {
            Console.WriteLine("Requested to close all...");


            Console.WriteLine("Done with the writing...");
        }

        private static object _lockObj = new object();

        private static void PrintMsg(object state)
        {
            Data data = state as Data;

            data.CurrentEvent.WaitOne();

            string msg = "Hello times...";
            for (int j = 0; j < 5; j++)
            {
                _fileStream.WriteLine(msg + data.Number);
               // Console.WriteLine(msg + data.Number);
            }

            data.NextEvent.Set();
        }
    }

    public class Data
    {
        public ManualResetEvent CurrentEvent { get; set; }
        public ManualResetEvent NextEvent { get; set; }
        public int Number { get; set; }
    } 
4

1 回答 1

3

听起来您正在描述一个应用程序管道,其中有多个线程,每个线程都在一个单独的工作项上工作。例如,一个线程可能做输入,一个线程做进程,一个线程做输出。

通常,您通过创建多个队列来处理此问题。假设你有这三个线程。输入线程读取一条记录并将其放入输入队列。处理线程读取输入队列,处理一个项目,并将结果放入输出队列。然后输出线程读取输出队列并将数据写入它需要去的地方。

这可确保以正确的顺序处理和写入工作项,但允许所有线程同时工作。

使用BlockingCollection,您可以让您的线程在队列上进行非忙碌等待。此外,当输入线程完成读取时,它可以调用CompleteAdding队列以发出没有更多工作项的信号。当处理线程读取队列时,它可以检查该IsCompleted属性以确定是否所有项目都已完成,从而退出。读取输出队列时,输出线程也是如此。

有关使用BlockingCollection. _

如果不能使用BlockingCollection,则必须在Queue<T>.

于 2012-11-15T15:02:48.923 回答