第一个方法完成后使用线程功能c#启动第二个方法

时间:2012-04-11 09:50:57

标签: c# multithreading methods status

我有一种方法正在重建网店的产品目录。在我更改了一些产品信息后,这是必要的。在重建方法之后,我想开始第二种方法来生成网上商店的全文索引。我可以看第一种方法的状态(RebuildCatalog)。如果状态为“RebuildFinished”,那么我想启动第二种方法(GenerateFullTextIndex)。我想使用Threads功能。有人可以创建一个如何实现这种情况的例子吗?

5 个答案:

答案 0 :(得分:1)

  

我想使用线程功能。

这听起来不像你。在另一个方法完成之后启动一个方法就像这样简单:

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

无需线程。如果你确实认为你需要多个线程,你应该解释为什么你认为他们会帮助你。你需要在什么时候同时执行多个任务?

答案 1 :(得分:1)

好吧,如果您想使用多个线程并在中分析您的调用,以便它们在另一个线程上执行,但是按顺序执行,并且您正在使用.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));

答案 2 :(得分: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));

答案 3 :(得分:0)

正如我可以从您的问题中假设您的重建方法可能需要相当长的时间,这就是您希望在单独的线程中运行的原因。因此,我建议实施Event based async pattern。当您的重建(异步)方法完成时,它将使用AsyncCompletedEventArgs抛出已完成的事件(您可以将其子类化以传递结果状态),然后从那里开始您的第二个方法。

答案 4 :(得分: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...
}