首页 新闻 会员 周边

并行请求时, 如何达成条件马上返回

0
悬赏园豆:30 [已解决问题] 解决于 2015-11-26 10:15

伪代码如下:

void int GetRemoteResult()

{

  int n = 0;

  await Task.WhenAll(list /*list.count=5*/, url=>{

    if (request(url)) 

      lock(nLock)

      {

        n++;

      }

  });

  return n;

}

请问如何才能在n=3的时候, 不等待其他请求完成就马上返回该方法?

c#
问题补充:

多个task并行, 每个task包含操作: 1个请求及请求成功后使n++. 每个请求的url都不一样. ("请求"指代任意运算过程)

当最快的3个请求返回true, 造成n=3, 就马上返回方法.

xiezhenhao的主页 xiezhenhao | 初学一级 | 园豆:100
提问于:2015-11-25 15:54
< >
分享
最佳答案
0

我查看了一下你的伪代码,我表述一下你的意思,

有很多线程去请求一个URL,你的意思是只要线程请求的数量达到3就直接返回。不用等待,是这个意思么?

如果不正确的话,请你表达一下你想要实现的功能

收获园豆:30
需要格局 | 老鸟四级 |园豆:2145 | 2015-11-25 17:35

请看问题补充

xiezhenhao | 园豆:100 (初学一级) | 2015-11-25 18:00

@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("一个完成了");
            }

        }
    }
}
需要格局 | 园豆:2145 (老鸟四级) | 2015-11-25 18:16

@田麦成: 这个方法不错, 但是count.Wait()会阻塞主线程

xiezhenhao | 园豆:100 (初学一级) | 2015-11-26 09:38

@xiezhenhao:我擦……

你主线程里这样子写就行了:

            Task.Factory.StartNew(() =>
                {
                    Request();
                });
            Console.WriteLine("方法返回了");
            Console.ReadKey();

 

你到底结不结分……

需要格局 | 园豆:2145 (老鸟四级) | 2015-11-26 10:03

如果上下文都用async await, 有没有好的解决方案?

xiezhenhao | 园豆:100 (初学一级) | 2015-11-26 10:19

@xiezhenhao:嗯,肯定可以用的,条条道路通罗马嘛,不过 这两个关键字,我用不好哈

需要格局 | 园豆:2145 (老鸟四级) | 2015-11-26 10:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册