为了账号安全,请及时绑定邮箱和手机立即绑定

关于多线程 如何实现这个功能~~

关于多线程 如何实现这个功能~~

烙印99 2018-12-06 21:20:03
假如:  有10个线程,想做同1件事情。   都去 取同1个 网页的内容。。   10个线程同时去取,如果 有1个线程取回来了。   那么其他线程就不用再取了,就立刻终止。。。。   求个思路,或者用哪个类实现?
查看完整描述

6 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

先问自己一些问题:(1)就算N个线程取网页的速度不同,能有多少差异呢?这个差异是如此大以至于不能容忍非要开10个线程比较速度?(2)为何是10个线程,为何不是8个,不是2个,不是20个?这个数字你是如何得出的?(3)就算是10个线程,平均速度一定比单线程取快吗?9个线程多少会拖慢速度的吧(增加远程服务器压力和本机压力)。然后单纯回答你的问题:

int threadsCount = 10;
var threads = new Thread[threadsCount];
var handles = new ManualResetEvent[threadsCount];

for (int i = 0; i < threadsCount; i++)
{
     var j = i;
     handles[j] = new ManualResetEvent(false);
     threads[j] = new Thread(() =>
    {
         //下载网页的代码
         handles[j].Set();
     });
     threads[j].Start();
}

var finished = WaitHandle.WaitAny(handles);
for (int i = 0; i < threadsCount; i++)
{
      if (i != finished)
      {
           try {   threads[i].Abort(); }
           catch { //记录日志什么的 }
      }
}

//继续你的工作

查看完整回答
反对 回复 2019-01-21
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

把十个线程存储到一个公共的数组里,当某一个线程完成后,则把别的线程停止,从线程池(数组里)取出来然后调用Stop函数。

查看完整回答
反对 回复 2019-01-21
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

线程停止,你们是怎么做的?

 

可能会出现这个情况哦。

Abort()?

查看完整回答
反对 回复 2019-01-21
?
慕慕森

TA贡献1856条经验 获得超17个赞

@水墨.MR.H: 对。就用这个Abort方法,不过,最好做一个TRY-CATCH,因为ABORT会报告一个线程异常停止的异常,虽然没什么影响,最好还是捕获一下。

查看完整回答
反对 回复 2019-01-21
?
千巷猫影

TA贡献1829条经验 获得超7个赞

我个人不认为这种做法是对的。

线程同步和互斥要考虑的复杂度很多很多。

这种场景下并不适合多线程。

查看完整回答
反对 回复 2019-01-21
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

肯定要用多线程,因为 不同线程取的速度不同。。

 

就像你同时 刷新2个网页,不一定先刷新的那个 就先加载完毕

查看完整回答
反对 回复 2019-01-21
  • 6 回答
  • 0 关注
  • 272 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信