创建X个同时执行任务的线程
本文关键字:执行任务 线程 创建 | 更新日期: 2023-09-27 18:00:30
我试图动态创建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();
}
不要将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);
}
}
您遇到了闭包问题。这里还有另一个问题在一定程度上解决了这个问题。
基本上,您需要在创建每个任务时捕获i
的值。实际情况是,当任务开始实际运行时,所有任务中i
的值都是相同的——循环结束时的值。