多线程/异步请求,等待它们全部完成,然后处理结果

时间:2010-12-06 19:56:20

标签: c# asp.net multithreading

我(想要)对多个来源执行搜索请求。 现在我已经做过一些多线程了,但这一切都是好事而忘记了。

现在我要做的是,在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#项目。

3 个答案:

答案 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。