本人菜鸟,现在在了解到线程被卡主了,遇到问题不知道怎么办?

aa819058637 2016-09-19 10:18:18
   
dw.proxyCodes = new string[] { "36441", "36371", "36367", "36368", "36369", "36370", "36373" };
Task[] tasks = new Task[dw.proxyCodes.Length];
for (int i = 0; i < tasks.Length; i++)
{
tasks[i] = new Task(delegate () { runTask(dw.getConnString(dw.proxyCodes[i]), dw.getFilename(dw.proxyCodes[i]), dw.getDwName(dw.proxyCodes[i]), dzDate, dw.proxyCodes[i], i); });
tasks[i].Start();
Thread.Sleep(1000);
}
try
{
Task.WaitAll();
}
catch (Exception ex) {
Log.Info("TASK........." + ex.Message);
}

开个7个任务,然后调用runTask!问题在于我必须Thread.Sleep。假如我不Thread.Sleep,程序没法向下运行,仿佛7个在打架一样我捕获不到任何异常。假如我设置 Thread.Sleep(100)运行可能有5个,4个,6个任务可以完成,每一次测试的结果不一样。还会出现这种异常。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
异常-ZlDanJiBan.DanJiBan/.ctor:已添加项。字典中的关键字:“diffie-hellman-group1-sha1”所添加的关键字:“cipher.c2s”
2016-09-19 21:28:39,680 [21] ERROR [(null)] - 异常-ZlDanJiBan.DanJiBan/.ctor:哈希表插入失败。负载因子太高。最常见的原因是多个线程正同时写入哈希表。
2016-09-19 21:28:40,335 [6] ERROR [(null)] - sftp连接失败!//Session.connect: System.IO.IOException: End of IO Stream Read
在 Tamir.SharpSsh.jsch.IO.getByte(Byte[] array, Int32 begin, Int32 length)
在 Tamir.SharpSsh.jsch.Session.read(Buffer buf)
在 Tamir.SharpSsh.jsch.UserAuthNone.start(Session session)
在 Tamir.SharpSsh.jsch.Session.connect(Int32 connectTimeout)
2016-09-19 21:28:40,335 [6] ERROR [(null)] - sftp获取文件失败!/未将对象引用设置到对象的实例。
2016-09-19 21:28:40,335 [6] ERROR [(null)] - 异常-ZlDanJiBan.DanJiBan/Dzz:未能找到文件“C:\Program Files (x86)\SNTSOFT\zfb\down\ALIPAY_WTCQCAITONG_DSDZ_36371_20160918.txt”。


请大牛帮我分析下原因在哪是不是他们都在抢占我的SFTP链接!还有通过什么形式的线程可以满足我上面这个功能!就是7个异步不干涉对方!
...全文
661 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
大然然 2016-09-29
  • 打赏
  • 举报
回复
····你没加锁
  • 打赏
  • 举报
回复
你要记住一点,Sleep 是会令人发笑的做法,而初学者又容易相当然地这样去考虑“方案”。你一旦想明白程序流程中Sleep 到底起的是正常的作用还是欺骗的作用,会豁然开朗。
  • 打赏
  • 举报
回复
引用 5 楼 aa819058637 的回复:
[quote=引用 1楼以专业开发人员为伍 的回复:]如果要 Sleep 延迟那么就不要“假装”线程并发程序了!通常你因为“同步的原因”而使用 Sleep 的时候就一下子令人同行发笑,这就好像一个人对人说可以“左右互搏”然后又先动左边然后再动右边,只能欺骗他自己。 首先你要考虑你到底有没有必要使用多线程并发计算。 其实假设使用多线程并发,就必须了解(对个别语句范围)进行同步的做法。
我是菜鸟!谢谢分享!虽然没怎么看懂![/quote] 很正常。如果一下子不费力气看上5~10遍就能看懂,那么我给你说的就不是一个重要的设计知识,而是简单的语法现象了。
qq_36188730 2016-09-20
  • 打赏
  • 举报
回复
<A href="http://www.corewise.cn/">手持终端</A> <A href="http://www.corewise.cn/">手持机</A> <A href="http://www.corewise.cn/">工业PDA</A>
aa819058637 2016-09-19
  • 打赏
  • 举报
回复
引用 2楼johnliuyuan 的回复:
检查一下你的代码,看看有没有竞态条件,造成多线程同时写入的情况
嗯嗯!谢谢!
aa819058637 2016-09-19
  • 打赏
  • 举报
回复
引用 1楼以专业开发人员为伍 的回复:
如果要 Sleep 延迟那么就不要“假装”线程并发程序了!通常你因为“同步的原因”而使用 Sleep 的时候就一下子令人同行发笑,这就好像一个人对人说可以“左右互搏”然后又先动左边然后再动右边,只能欺骗他自己。 首先你要考虑你到底有没有必要使用多线程并发计算。 其实假设使用多线程并发,就必须了解(对个别语句范围)进行同步的做法。
我是菜鸟!谢谢分享!虽然没怎么看懂!
aa819058637 2016-09-19
  • 打赏
  • 举报
回复
引用 3楼johnliuyuan 的回复:
你现在的情况就是多线程同时写入,造成访问异常,之所以sleep长一点时间不会出错,是因为在这种情况下,sleep的时间已经足够线程运行完,从而将多线程弄成了同时只有单个线程在执行,这样就不会出现访问异常了
我也觉得是这样!但是一般出现这种原因在那??
john_QQ:2335298917 2016-09-19
  • 打赏
  • 举报
回复
你现在的情况就是多线程同时写入,造成访问异常,之所以sleep长一点时间不会出错,是因为在这种情况下,sleep的时间已经足够线程运行完,从而将多线程弄成了同时只有单个线程在执行,这样就不会出现访问异常了
john_QQ:2335298917 2016-09-19
  • 打赏
  • 举报
回复
检查一下你的代码,看看有没有竞态条件,造成多线程同时写入的情况
  • 打赏
  • 举报
回复
如果要 Sleep 延迟那么就不要“假装”线程并发程序了!通常你因为“同步的原因”而使用 Sleep 的时候就一下子令人同行发笑,这就好像一个人对人说可以“左右互搏”然后又先动左边然后再动右边,只能欺骗他自己。 首先你要考虑你到底有没有必要使用多线程并发计算。 其实假设使用多线程并发,就必须了解(对个别语句范围)进行同步的做法。

111,128

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧