伪代码如下:
void int GetRemoteResult()
{
int n = 0;
await Task.WhenAll(list /*list.count=5*/, url=>{
if (request(url))
lock(nLock)
{
n++;
}
});
return n;
}
请问如何才能在n=3的时候, 不等待其他请求完成就马上返回该方法?
多个task并行, 每个task包含操作: 1个请求及请求成功后使n++. 每个请求的url都不一样. ("请求"指代任意运算过程)
当最快的3个请求返回true, 造成n=3, 就马上返回方法.
我查看了一下你的伪代码,我表述一下你的意思,
有很多线程去请求一个URL,你的意思是只要线程请求的数量达到3就直接返回。不用等待,是这个意思么?
如果不正确的话,请你表达一下你想要实现的功能
请看问题补充
@xiezhenhao: OK 代码已经写好。
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using System.Threading; namespace ConsoleApplication1 { class Program { static CountdownEvent count = new CountdownEvent(3); static void Main(string[] args) { Request(); Console.WriteLine("方法返回了"); Console.ReadKey(); } static public void Request() { count.Reset(); //启动50个进程去请求博客园 for (int i = 0; i < 50; i++) { WebClient w = new WebClient(); w.DownloadDataTaskAsync("http://www.cnblogs.com/"); w.DownloadDataCompleted += w_DownloadDataCompleted; } count.Wait(); } static void w_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e) { if (count.CurrentCount>0) { //成功一个就减少计数 count.Signal(); Console.WriteLine("一个完成了"); } } } }
@田麦成: 这个方法不错, 但是count.Wait()会阻塞主线程
@xiezhenhao:我擦……
你主线程里这样子写就行了:
Task.Factory.StartNew(() => { Request(); }); Console.WriteLine("方法返回了"); Console.ReadKey();
你到底结不结分……
如果上下文都用async await, 有没有好的解决方案?
@xiezhenhao:嗯,肯定可以用的,条条道路通罗马嘛,不过 这两个关键字,我用不好哈