ウェブショップの商品カタログを再構築する方法があります。これは、一部の製品情報を変更した後に必要になります。再構築方法の後、ウェブショップの全文索引を生成する 2 番目の方法を開始したいと思います。最初のメソッド (RebuildCatalog) のステータスを見ることができます。ステータスが「RebuildFinished」の場合、2 番目のメソッド (GenerateFullTextIndex) を開始したいと思います。スレッド機能を使用したいと思います。誰かがこのシナリオを実装する方法の例を作成できますか?
5 に答える
複数のスレッドを使用し、チェーン内の呼び出しを oranizeして別のスレッドで実行されるようにしたいが、順番に を使用している場合、たとえばTask::ContinueWithメソッドを使用するように、 Task Parallelism.NET Framework 4.0>
を使用できます。
例 (MSDN の preudocode):
Task<byte[]> getData = new Task<byte[]>(() => GetFileData());
Task<double[]> analyzeData = getData.ContinueWith(x => Analyze(x.Result));
Task<string> reportData = analyzeData.ContinueWith(y => Summarize(y.Result));
getData.Start();
//or...
Task<string> reportData2 = Task.Factory.StartNew(() => GetFileData())
.ContinueWith((x) => Analyze(x.Result))
.ContinueWith((y) => Summarize(y.Result));
ステータスを監視するよりも、イベントを使用する方が簡単に思えます。
再構築カタログ コードで、完了時に「終了」イベントを発生させます。
public event EventHandler<EventArgs> RebuildFinished;
private void Rebuild(...)
{
// Rebuild the catalog
this.RebuildFinished(this, new EventArgs(...));
}
次に、それを処理します。
this.catalog.RebuildFinished += this.RebuildFinished;
private void RebuildFinished(object sender, EventArgs e)
{
// Rebuild the index
}
これらは両方ともスレッドを使用して、アプリケーションの UI の応答性を維持できるようになりました。
this.catalogThread = new Thread(new ThreadStart(this.catalog.Rebuild));
スレッド機能を使用したいと思います。
それは本当にあなたのようには聞こえません。次のように、次のように簡単にメソッドを開始できます。
var status = RebuildCatalog();
if (status == Status.RebuildFinished)
{
GenerateFullTextIndex();
}
糸通し不要。複数のスレッドが本当に必要だと思う場合は、それらが役立つと考える理由を説明する必要があります。複数のタスクを同時に実行する必要があるのはどの時点ですか?
BackgroundWorker bw1 = new BackgroundWorker();//To rebuild catalog.
BackgroundWorker bw2 = new BackgroundWorker();//To generate text.
public Form1()
{
InitializeComponent();
bw1.DoWork += bw1_DoWork;
bw1.RunWorkerCompleted += bw1_RunWorkerCompleted;
bw2.DoWork += bw2_DoWork;
bw2.RunWorkerCompleted += bw2_RunWorkerCompleted;
bw1.RunWorkerAsync();//Start new thread. - Rebuild catalog.
}
void bw1_DoWork(object sender, DoWorkEventArgs e)
{
//Rebuild catalog.
}
void bw1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
bw2.RunWorkerAsync();//Generate text.
}
void bw2_DoWork(object sender, DoWorkEventArgs e)
{
//Generate text.
}
void bw2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//Whatever...
}
あなたの質問から推測できるように、再構築方法にはおそらくかなりの時間がかかるため、別のスレッドで実行する必要があります。したがって、Event based async pattern を実装することをお勧めします。再構築 (非同期) メソッドが終了すると、AsyncCompletedEventArgs (結果ステータスを渡すためにサブクラス化できます) で終了イベントがスローされ、そこから 2 番目のメソッドが開始されます。