我正在尝试动态创建X个线程(由用户指定),然后基本上所有这些线程都以1秒的间隔在同一时间执行一些代码。
我遇到的问题是我尝试完成的任务依赖于循环来确定当前IP是否等于最后一个IP。 (它扫描主机)所以,因为我在内部有这个循环,它正在关闭,然后其他线程没有被创建,并且没有执行代码。我希望他们同时关闭,等待1秒(使用计时器或其他不会锁定线程的东西,因为它正在执行的代码有一个等待的超时。)任何人都可以帮助我吗?这是我目前的代码:
int threads = Convert.ToInt32(txtThreads.Text);
List<Thread> workerThreads = new List<Thread>();
string from = txtStart.Text, to = txtEnd.Text;
uint current = from.ToUInt(), last = to.ToUInt();
ulong total = last - current;
for (int i = 0; i < threads; i++)
{
Thread thread = new Thread(() =>
{
for (int t = 0; t < Convert.ToInt32(total); t += i)
{
while (current <= last)
{
current = Convert.ToUInt32(current + t);
var ip = current.ToIPAddress();
doSomething(ip);
}
}
});
workerThreads.Add(thread);
thread.Start();
}
答案 0 :(得分:3)
不要使用lambda作为主题的主体,否则i
值不会按照您的想法行事。而是将值传递给方法。
至于同时启动所有线程,请执行以下操作:
private object syncObj = new object();
void ThreadBody(object boxed)
{
Params params = (Params)boxed;
lock (syncObj)
{
Monitor.Wait(syncObj);
}
// do work here
}
struct Params
{
// passed values here
}
void InitializeThreads()
{
int threads = Convert.ToInt32(txtThreads.Text);
List<Thread> workerThreads = new List<Thread>();
string from = txtStart.Text, to = txtEnd.Text;
uint current = from.ToUInt(), last = to.ToUInt();
ulong total = last - current;
for (int i = 0; i < threads; i++)
{
Thread thread = new Thread(new ParameterizedThreadStart(this.ThreadBody, new Params { /* initialize values here */ }));
workerThreads.Add(thread);
thread.Start();
}
lock(syncObj)
{
Monitor.PulseAll(syncObj);
}
}
答案 1 :(得分:0)
你遇到了关闭问题。还有一个问题在某种程度上解决了这个问题,here。
基本上,您需要在创建每个任务时捕获i
的值。发生的事情是当任务到达实际运行时,所有任务中i
的值都是相同的 - 循环结束时的值。