首页 新闻 会员 周边 捐助

求助:循环执行一个线程

0
悬赏园豆:20 [已解决问题] 解决于 2018-10-20 13:25
大家好,有一个线程,在循环内执行,完成一次线程时间长短不一定,执行完成后再进入下一循环参数,如何实现,多谢!!

这是一个根据IP获取详细信息的程序,参数是IP起始和结束地址段,请问如何修改,代码如下:

private List<Thread> ThreadList;
private BindingList<taobaoIPdata> taobaoIPdataList;

private void Load(string beginIP,string endIP)
{
StartIP = IPHelper.Ip2Long(beginIP);
CurrentCollectIP = StartIP - 1;
EndIP = IPHelper.Ip2Long(endIP);
ThreadCount = (int)this.nud_ThreadCount.Value;
taobaoIPdataList = new BindingList<taobaoIPdata>();
ThreadList = new List<Thread>();
ThreadList.Add(new Thread(GetTaobaoData) { IsBackground = true });
}
private void btn_begin_Click(object sender, EventArgs e)
{
Load( txt_Start.Text , txt_End.Text);
thread.Start();
}
private long GetCurrentIp()
{
long curip = System.Threading.Interlocked.Increment(ref CurrentCollectIP);
return curip;
}
/// <summary>
/// 线程中采集的方法
/// </summary>
private void GetTaobaoData()
{
long currentipLong = GetCurrentIp();
while (currentipLong <= EndIP)
{
try
{
CaptureTaobaoIPData(currentipLong);
}
catch (Exception ex)
{
TextLog.SetString(currentipLong + ex.Message);
}
currentipLong = GetCurrentIp();
}
}
/// <summary>
/// 描述:线程中采集并得到IP
/// </summary>
private void CaptureTaobaoIPData(long currentipLong)
{
string ip = IPHelper.Long2Ip(currentipLong);
string url = string.Format(UrlFomat, ip);
string js =HttpHelper. HttpRequest(url, Encoding.UTF8);
taobaoIPdata m = Newtonsoft.Json.JsonConvert.DeserializeObject<TaobaoJsonData>(js).data;
m.ipLong = currentipLong;
taobaoIPdataList.Add(m);
//todo: 存储IP到数据库
}

我的理想之路的主页 我的理想之路 | 初学一级 | 园豆:143
提问于:2016-01-04 14:44
< >
分享
最佳答案
0

for()

{

task.factory.startnew(()=>{

//dosomething...

});

task.wait();

}

收获园豆:5
起个名字 | 菜鸟二级 |园豆:377 | 2016-01-04 15:18

你好,根据我上面给出的代码,具体在什么位置加循环比较好呢?

我的理想之路 | 园豆:143 (初学一级) | 2016-01-04 16:26

@我的理想之路: for循环啊,里面是一个task,task.wait()这句会等到task执行完成后才往下执行

起个名字 | 园豆:377 (菜鸟二级) | 2016-01-04 17:02
其他回答(5)
0
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            CancellationTokenSource s = new CancellationTokenSource();
            CancellationToken token = s.Token;

            for (int i = 0; i < 5000; i++)
            {
                Thread th = new Thread(new ParameterizedThreadStart((o) =>
                    {
                        Console.WriteLine(o.ToString());
                    }));
                th.Start(i);
                token.WaitHandle.WaitOne(50);
            }
        }
    }
}
收获园豆:5
需要格局 | 园豆:2145 (老鸟四级) | 2016-01-04 15:23

您好,50MS不一定可以完成一个线程,我已经把问题代码写出来了,请参考一下,多谢。

支持(0) 反对(0) 我的理想之路 | 园豆:143 (初学一级) | 2016-01-04 15:58

@我的理想之路: WaitOne不带参数就会一直等待下去.

支持(0) 反对(0) 水晶途途 | 园豆:1443 (小虾三级) | 2016-01-04 16:07

@水晶途途: 50有些少,可否换成事件响应机制,5000个计数,是否要产生5000个线程?

如果根据我提供的代码,这个循环加在哪里比较合适?

支持(0) 反对(0) 我的理想之路 | 园豆:143 (初学一级) | 2016-01-04 16:36
0
public static async void Run()
        {
            var rm = new Random();
            for (var i = 0; i < 100; i++)
            {
                await Task.Run(async () =>
                {
                    await Task.Delay(rm.Next(200, 1000));
                    Console.WriteLine(i);
                });
            }
        }
收获园豆:5
写代码的小2B | 园豆:4377 (老鸟四级) | 2016-01-04 16:24
0

用变量控制吧。我就这样。

一个整数变量和后面的两个操作就ok.

Interlocked.Increment

Interlocked.Decrement

Supper_litt | 园豆:1036 (小虾三级) | 2016-01-04 16:32
0

class ThreadA{

    run(){

   //dosth

   if(){

    new ThreadA().start();

     }

   }

}

main{

    new ThreadA().start();

}

司幸 | 园豆:319 (菜鸟二级) | 2016-01-04 17:02
0

Task  task.Wait就可以啊。 不是有人说了吗、

收获园豆:5
呓语鑫 | 园豆:313 (菜鸟二级) | 2016-01-05 11:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册