我有一種方法是重建網店的產品目錄。在更改一些產品信息後,這是必要的。在重建方法之後,我想開始第二種方法來生成網上商店的全文索引。我可以觀察第一種方法(RebuildCatalog)的狀態。如果狀態是「RebuildFinished」,那麼我想開始第二種方法(GenerateFullTextIndex)。我想使用線程功能。有人可以創建一個如何實現這個場景的例子嗎?第一種方法完成線程功能後啓動第二種方法c#
0
A
回答
1
我想使用線程功能。
它確實聽起來不像你。
var status = RebuildCatalog();
if (status == Status.RebuildFinished)
{
GenerateFullTextIndex();
}
無需穿線:另一個結束後開始一個方法,就是這麼簡單。如果你真的認爲你需要多個線程,你應該解釋爲什麼你認爲他們會幫助。你需要在什麼時候同時執行多個任務?
0
正如我從你的問題可以推測你的重建方法可能需要相當長的時間,這就是爲什麼你想在一個單獨的線程運行。因此我建議實施Event based async pattern。當你的重建(異步)方法完成時,它將拋出AsyncCompletedEventArgs(你可以繼承以傳遞你的結果狀態)完成的事件,並從那裏開始你的第二個方法。
1
好吧,如果你想使用多線程和鏈所以他們在另一個線程上執行oranize您的來電,但在序列,並且使用的是.NET Framework 4.0>
,您可以像使用例如使用Task Parallelism, Task::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...
}
相關問題
- 1. 第一種方法完成後的運行方法
- 2. 如何僅在執行第一種方法後執行第二種方法
- 3. 從第一種方法調用第二種方法會更改第一種方法的行爲
- 4. 重新啓動第一功能後完成第二
- 5. 代碼第一種方法與數據庫第一種方法
- 6. 在調用第一種方法時觸發第二種方法的調用
- 7. 不定義第二種方法?
- 8. 茉莉模擬第二種方法
- 9. 第一次完成後執行方法
- 10. 如何爲第二種方法工作做第二次回報?
- 11. 爲什麼第一種方法是promisifying工作而不是第二種?
- 12. 爲什麼第二種解決方案比第一種更快?
- 13. 一種方法fscanf只在第一行
- 14. 完成另一種方法後執行方法
- 15. 完成javascript中的另一種方法後的消防方法
- 16. 完成另一種方法後執行方法的問題 - iOS
- 17. 可以通過第二種方法調用方法的屬性
- 18. ViewModel-Silverlight導航的第一種方法
- 19. EF4和代碼第一種方法
- 20. 如何通過返回主方法然後輸入第二個方法將兩個平行數組從一種方法移動到另一種方法?
- 21. 防止第二次啓動的功能,如果第一次沒有完成
- 22. 等待異步:如何在第二個啓動之前完成一個方法
- 23. 在其他兩種方法完成後調用方法
- 24. 第二次啓動線程
- 25. Mockito的ArgumentCaptor:一種方法名稱,兩種方法定義(第2部分)
- 26. 多種方法的C#線程
- 27. 一種方法執行兩個功能
- 28. jQuery驗證火第二種方法,只有當第一個是真
- 29. 如何等待某種方法在另一種方法中完成?
- 30. 我需要幫助開始一種方法後,另一種方法完成後,而不是在它
因爲當我執行重建方法時,花費了很多時間(例如, 1分鐘)。我不想在網站上等待。我只想按下重建目錄按鈕。然後我想方法1從背景開始,當方法1完成時(我可以檢查重建的狀態)我想要啓動方法2(生成全文索引)。我希望你瞭解我的情況。 – Ola 2012-04-11 10:55:58
@ user1326231:這聽起來像是你希望*兩個*調用都在同一個新線程上? – 2012-04-11 11:22:54