在我的程序中,我收到了一些数据,我必须将其保存到一个文件(一个或多个)中,数据的顺序非常重要,所以它应该像先到先得一样保存。
最后,我收到一个信号,表明此时不再有数据可用,我必须关闭所有打开的文件,我该如何处理它,我的意思是如何确保所有线程都完成了它们的工作,以便,我可以关闭文件。
我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; }
}