我有一种方法是重建网上商店的产品目录。在我更改一些产品信息后,这是必要的。在重建方法之后,我想开始第二种方法来生成网店的全文索引。我可以查看第一种方法(RebuildCatalog)的状态。如果状态是“RebuildFinished”,那么我想开始第二种方法(GenerateFullTextIndex)。我想使用线程功能。有人可以创建一个如何实现此场景的示例吗?
问问题
1172 次
5 回答
1
我想使用线程功能。
听起来真的不像你。一个又一个完成后开始一个方法很简单:
var status = RebuildCatalog();
if (status == Status.RebuildFinished)
{
GenerateFullTextIndex();
}
无需穿线。如果你真的认为你需要多个线程,你应该解释为什么你认为它们会有所帮助。什么时候需要同时执行多个任务?
于 2012-04-11T09:53:52.247 回答
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));
于 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 回答
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
正如我可以从您的问题中假设的那样,您的重建方法可能会占用大量时间,这就是您想要在单独的线程中运行的原因。因此我建议实现基于事件的异步模式。当您的重建(异步)方法完成时,它将使用 AsyncCompletedEventArgs 抛出完成的事件(您可以将其子类化以传递结果状态),然后您将开始您的第二个方法。
于 2012-04-11T10:03:06.230 回答