我(想要)对多个来源执行搜索请求。 现在我已经做过一些多线程了,但这一切都是好事而忘记了。
现在我要做的是,在3个不同的对象上提出3个相同的请求,等到它们全部“完成”(这给了我第一个问题:他们怎么说'我做完了',然后收集你发给我的所有数据。
所以在伪代码中我有这个界面:
interface ISearch
SearchResult SearchForContent(SearchCriteria criteria)
所以在代码中我创建了三个搜索服务:
ISearch s1 = new SearchLocal();
ISearch s2 = new SearchThere();
ISearch s3 = new SearchHere();
然后以多线程/异步方式在所有这三个上调用SearchForContent(SearchCriteria criteria)
然后他们全都带着他们的SearchResult
回到我身边,在他们全部完成后,我处理他们的SearchResult
个对象。
我希望这些文字能让你理解我的想法:)
我正在开发一个ASP.Net 3.5 C#项目。
答案 0 :(得分:6)
创建AutoResetEvent
并将其传递给WaitHandle.WaitAll()
有一个例子here。
基本上:
1)您为每次搜索创建AutoResetEvent
并将false
传递给其构造函数。
2)创建线程并对每个线程运行搜索,最后在 finally 块中的Set
上调用AutoResetEvent
。 在finally块中调用Set
非常重要,否则WaitAll()
将无限期地等待。
3)在您生成线程后的代码中,您调用WaitHandle.WaitAll()
并将所有AutoResetEvent
传递给它。此代码将等待,直到完成所有操作。
答案 1 :(得分:2)
使用任务你可以像这样继续:
Task[] t = new Task[2];
t[0] = Task.Factory.StartNew(() => { Thread.Sleep(1000); });
t[1] = Task.Factory.StartNew(() => { Thread.Sleep(2000); });
Task.Factory.ContinueWhenAll(t, myTasks => { Console.WriteLine("All done!"); });
答案 2 :(得分:0)
制作一个IEnumerable<ISearch>
及其中的项目,并对其进行.AsParallel().ForAll(...)
。
修改强> 的
ForAll不会返回结果,如果你可以改变ISearch,给它一个结果的属性,那么一旦ForAll完成,你可以通过IEnumerable查看结果。
是的,抱歉,这是4.0。