2012-04-11 95 views
0

我有一種方法是重建網店的產品目錄。在更改一些產品信息後,這是必要的。在重建方法之後,我想開始第二種方法來生成網上商店的全文索引。我可以觀察第一種方法(RebuildCatalog)的狀態。如果狀態是「RebuildFinished」,那麼我想開始第二種方法(GenerateFullTextIndex)。我想使用線程功能。有人可以創建一個如何實現這個場景的例子嗎?第一種方法完成線程功能後啓動第二種方法c#

回答

1

我想使用線程功能。

它確實聽起來不像你。

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

無需穿線:另一個結束後開始一個方法,就是這麼簡單。如果你真的認爲你需要多個線程,你應該解釋爲什麼你認爲他們會幫助。你需要在什麼時候同時執行多個任務?

+0

因爲當我執行重建方法時,花費了很多時間(例如, 1分鐘)。我不想在網站上等待。我只想按下重建目錄按鈕。然後我想方法1從背景開始,當方法1完成時(我可以檢查重建的狀態)我想要啓動方法2(生成全文索引)。我希望你瞭解我的情況。 – Ola 2012-04-11 10:55:58

+0

@ user1326231:這聽起來像是你希望*兩個*調用都在同一個新線程上? – 2012-04-11 11:22:54

0

正如我從你的問題可以推測你的重建方法可能需要相當長的時間,這就是爲什麼你想在一個單獨的線程運行。因此我建議實施Event based async pattern。當你的重建(異步)方法完成時,它將拋出AsyncCompletedEventArgs(你可以繼承以傳遞你的結果狀態)完成的事件,並從那裏開始你的第二個方法。

1

好吧,如果你想使用多線程和所以他們在另一個線程上執行oranize您的來電,但在序列,並且使用的是.NET Framework 4.0>,您可以像使用例如使用Task ParallelismTask::ContinueWith方法。

例(preudocode從MSDN):

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... 
} 
相關問題