0

ウェブショップの商品カタログを再構築する方法があります。これは、一部の製品情報を変更した後に必要になります。再構築方法の後、ウェブショップの全文索引を生成する 2 番目の方法を開始したいと思います。最初のメソッド (RebuildCatalog) のステータスを見ることができます。ステータスが「RebuildFinished」の場合、2 番目のメソッド (GenerateFullTextIndex) を開始したいと思います。スレッド機能を使用したいと思います。誰かがこのシナリオを実装する方法の例を作成できますか?

4

5 に答える 5

1

複数のスレッドを使用し、チェーン内の呼び出しを 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));
于 2012-04-11T10:03:10.973 に答える
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));
于 2012-04-11T10:03:13.220 に答える
1

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

それは本当にあなたのようには聞こえません。次のように、次のように簡単にメソッドを開始できます。

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

糸通し不要。複数のスレッドが本当に必要だと思う場合は、それらが役立つと考える理由を説明する必要があります。複数のタスクを同時に実行する必要があるのはどの時点ですか?

于 2012-04-11T09:53:52.247 に答える
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...
}
于 2012-04-11T21:16:58.397 に答える
0

あなたの質問から推測できるように、再構築方法にはおそらくかなりの時間がかかるため、別のスレッドで実行する必要があります。したがって、Event based async pattern を実装することをお勧めします。再構築 (非同期) メソッドが終了すると、AsyncCompletedEventArgs (結果ステータスを渡すためにサブクラス化できます) で終了イベントがスローされ、そこから 2 番目のメソッドが開始されます。

于 2012-04-11T10:03:06.230 に答える