Webshopの製品カタログを再構築する方法があります。これは、製品情報を変更した後に必要です。再構築メソッドの後、webshopのフルテキストインデックスを生成する2番目の方法を開始したいと思います。私は最初のメソッド(RebuildCatalog)の状態を見ることができます。ステータスが "RebuildFinished"の場合は、2番目のメソッド(GenerateFullTextIndex)を開始します。スレッド機能を使用したいと思います。誰かがこのシナリオの実装方法の例を作成できますか?最初のメソッドがスレッド機能で終了した後に2番目のメソッドを開始する#
0
A
答えて
1
スレッド機能を使用したいと思います。
本当にあなたのようには聞こえません。
var status = RebuildCatalog();
if (status == Status.RebuildFinished)
{
GenerateFullTextIndex();
}
ませスレッドは必要ありません:別の終了後に一つの方法を開始することと同じくらい簡単です。 本当にに複数のスレッドが必要と思われる場合は、なぜと記述すればよいでしょうか。どの時点で複数のタスクを同時に実行する必要がありますか?
0
あなたの質問から推測することができるように、おそらくあなたは別のスレッドで実行したいと考えているので、再構築の方法にかなりの時間がかかります。したがって、Event based async patternを実装することをお勧めします。再構築(非同期)メソッドが終了すると、AsyncCompletedEventArgs(結果ステータスを渡すためにサブクラス化できる)で終了イベントがスローされ、そこから2番目のメソッドが開始されます。
1
さて、あなたは複数のスレッドを使用してチェーンであなたの通話をoranizeしたい場合ので、彼らは別のスレッドで実行されますが、順番に、あなたが.NET Framework 4.0>
を使用している、あなたが使用して、たとえばのように、Task Parallelismを使用することができますTask::ContinueWith方法。
例(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));
1
は状況を見ているよりも簡単であるように思われます。完了時にカタログコードの火を再構築し、「終了」イベントで
:
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));
0
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...
}
関連する問題
- 1. 最初のものが終了したときに2番目のjavascriptを開始する
- 2. Velocity.js:最初のセットが終了した後の2番目のオブジェクトのアニメーション
- 3. C# - フォーム終了後の開始機能
- 4. スレッドの後のコールバック。開始()が終了しましたか?
- 5. 最初のメソッドの実行が完了する前に、2番目のメソッドの実行を避けますか?
- 6. 2番目のスレッドが最初のスレッドの終了を待つ場合、メモリバリアが必要ですか?
- 7. vbaは名前のリストをループし、機能を実行します。最後のループが終了した2番目のループの開始
- 8. 最初の終了後に2番目のURLを読み込む方法
- 9. 2番目のonopenメソッドで最初のイベントソースを閉じる
- 10. Python:最後の項目からループを開始し、最初の項目から終了します
- 11. HTML5オーディオプレイリスト - 最初のオーディオファイルが終了した後に2番目のオーディオファイルを再生する方法は?
- 12. 最初のスレッドが終了した後、どのスレッドがスケジュールされますか?
- 13. dockerのElasticSearch - 2番目のインスタンスが最初のインスタンスを終了します
- 14. 2番目のスレッドは、最初に終了するまでguiを更新しません。
- 15. 開始直後にRailsサーバーが終了する<未定義のメソッド>
- 16. 最初のアヤックスを終了してから2番目のアヤックスを終了してループ内で3番目のアヤックスを終了します
- 17. メソッドの終了後にスレッドを実行しますか?
- 18. 最初のボタンが機能し、2番目のボタンは機能しません
- 19. Async:2つ目のメソッドが開始する前に1つのメソッドを完了する方法
- 20. 他のメソッドがJQUERYで終了した後にメソッドを実行します
- 21. メソッドの終了後にonMapReady()の代入が終了しない
- 22. Python:最初のタスクが終了したときにのみ2番目のタスクを実行するには
- 23. IOS/Objective-C:uiactivityindicatorviewを開始して終了するメソッド
- 24. メソッド変数の寿命がメソッド/スレッド内で開始される
- 25. 最初のメソッドの呼び出し時に2番目のメソッドへの呼び出しをトリガーする
- 26. 以前の最初のdispatch_asyncが終了したときに、2番目のdispatch_asyncを実行する方法は?
- 27. メソッド終了後にJavaFxがフリーズする
- 28. 前のメソッドが終了した後にメソッドを実行します
- 29. 別々のEJBメソッドでのトランザクションの開始/終了
- 30. どのスレッドが同時スレッドで最初に終了しましたか?
私が再構築メソッドを実行すると、非常に時間がかかります(e.a. 1分)終了します。私はウェブサイトで待つことを望んでいない。私は、ボタンの再構築カタログを押すだけです。そして、メソッド1をバックグラウンドで開始し、メソッド1が終了したら(再構築の状態を確認できます)、メソッド2(フルテキストインデックスを生成)を開始したいと思います。私の状況を理解してくれることを願っています – Ola
@ user1326231:両方の呼び出しが同じ新しいスレッドになるように思えますか? –