2012-04-11 14 views
0

Webshopの製品カタログを再構築する方法があります。これは、製品情報を変更した後に必要です。再構築メソッドの後、webshopのフルテキストインデックスを生成する2番目の方法を開始したいと思います。私は最初のメソッド(RebuildCatalog)の状態を見ることができます。ステータスが "RebuildFinished"の場合は、2番目のメソッド(GenerateFullTextIndex)を開始します。スレッド機能を使用したいと思います。誰かがこのシナリオの実装方法の例を作成できますか?最初のメソッドがスレッド機能で終了した後に2番目のメソッドを開始する#

答えて

1

スレッド機能を使用したいと思います。

本当にあなたのようには聞こえません。

var status = RebuildCatalog(); 
if (status == Status.RebuildFinished) 
{ 
    GenerateFullTextIndex(); 
} 

ませスレッドは必要ありません:別の終了後に一つの方法を開始することと同じくらい簡単です。 本当にに複数のスレッドが必要と思われる場合は、なぜと記述すればよいでしょうか。どの時点で複数のタスクを同時に実行する必要がありますか?

+0

私が再構築メソッドを実行すると、非常に時間がかかります(e.a. 1分)終了します。私はウェブサイトで待つことを望んでいない。私は、ボタンの再構築カタログを押すだけです。そして、メソッド1をバックグラウンドで開始し、メソッド1が終了したら(再構築の状態を確認できます)、メソッド2(フルテキストインデックスを生成)を開始したいと思います。私の状況を理解してくれることを願っています – Ola

+0

@ user1326231:両方の呼び出しが同じ新しいスレッドになるように思えますか? –

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... 
} 
関連する問題