2012-04-11 70 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... 
} 
相关问题