私のプログラムでは、いくつかのデータを受け取っており、それをファイル (1 つまたは複数) に保存する必要があります。データの順序は非常に重要であるため、先着順に保存する必要があります。
最後に、この時点でデータがもう利用できないという信号を受け取ります。開いているすべてのファイルを閉じる必要があります。どうすれば処理できますか。つまり、すべてのスレッドが作業を完了したことを確認するにはどうすればよいかということです。 、ファイルを閉じることができます。
データの順序を制御するために使用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; }
}