我有一种方法是重建网店的产品目录。在更改一些产品信息后,这是必要的。在重建方法之后,我想开始第二种方法来生成网上商店的全文索引。我可以观察第一种方法(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