how to use thread in for loop in c#
-
the requirement goes like this ... I have set of ip's . i am looping through the IP list and for each ip i am checking whether i can ping them , i have given a time out of 4 seconds for ping reply. and am storing the result in a datatable.Pleas let me know how it can be implemented using threading to make the looping faster without losing any data as most of the ips are taking 3-4 seconds for reply.
Ok, it's a little tricky. The simplest way, not very good is: make one thread for every ping action, start them all, then Join them all. Is that good enough for you? Otherwise, use ping.SendAsync, and make very sure that PingCompletedEventHandler is thread-safe. The handler will have to 1) save the result (safely! may involve locking) and 2) signal a waithandle (after saving the result). Then you can do a WaitAll over all the waithandles to continue when all the pings are done.
-
Ok, it's a little tricky. The simplest way, not very good is: make one thread for every ping action, start them all, then Join them all. Is that good enough for you? Otherwise, use ping.SendAsync, and make very sure that PingCompletedEventHandler is thread-safe. The handler will have to 1) save the result (safely! may involve locking) and 2) signal a waithandle (after saving the result). Then you can do a WaitAll over all the waithandles to continue when all the pings are done.
if i follow the first option, Do in need to specify any timeout in Thread.Join method.
-
if i follow the first option, Do in need to specify any timeout in Thread.Join method.
-
If the pings have a timeout, that should not be necessary, though it wouldn't be a problem either (as long as it's high enough to give the pings time to succeed).
i think i need to specify timeout in join with more that 2500 ms as i have specified a time out of 2 sec. without any time out its very slow.
-
i think i need to specify timeout in join with more that 2500 ms as i have specified a time out of 2 sec. without any time out its very slow.
-
But sometimes the pings took 4 seconds, right?
superselector wrote:
without any time out its very slow.
Well that's weird, it shouldn't take significantly longer than the longest running ping. Could you show the code?
yes the time out takes 4 secs, i have given 2 secs for testing ... actually on successful ping checking for ping i am trying to get some basic details of that ip using WMI.WMI is taking some time also if its not enabled.
for (int index = startIP; index <= EndIP; index++)
{
ipVal = startSubnet + "." + index.ToString();Thread wmithread = new Thread(() => PerformWMIOperation(ipVal.ToString().Trim(), txtUserName.Text.ToString().Trim(), txtPassword.Text.ToString(), txtDomain.Text.ToString(), dtAssetValues, chkImpersonate.Checked, recordnumber)); wmithread.Start(); wmithread.Join(2500); }
-
yes the time out takes 4 secs, i have given 2 secs for testing ... actually on successful ping checking for ping i am trying to get some basic details of that ip using WMI.WMI is taking some time also if its not enabled.
for (int index = startIP; index <= EndIP; index++)
{
ipVal = startSubnet + "." + index.ToString();Thread wmithread = new Thread(() => PerformWMIOperation(ipVal.ToString().Trim(), txtUserName.Text.ToString().Trim(), txtPassword.Text.ToString(), txtDomain.Text.ToString(), dtAssetValues, chkImpersonate.Checked, recordnumber)); wmithread.Start(); wmithread.Join(2500); }
-
Ok, not like that. Don't, "for every thread, start it, then join it". That just runs everything in serial. Do, "for every thread, start it. Then, for every thread, join it." That's how I said it: start them all then join them all.
Hi i did not understand do you want the code to be changed to for (int index = startIP; index <= EndIP; index++) { ipVal = startSubnet + "." + index.ToString(); Thread wmithread = new Thread(() => PerformWMIOperation(ipVal.ToString().Trim(), txtUserName.Text.ToString().Trim(), txtPassword.Text.ToString(), txtDomain.Text.ToString(), dtAssetValues, chkImpersonate.Checked, recordnumber)); wmithread.Start(); wmithread.Join(); }
-
Hi i did not understand do you want the code to be changed to for (int index = startIP; index <= EndIP; index++) { ipVal = startSubnet + "." + index.ToString(); Thread wmithread = new Thread(() => PerformWMIOperation(ipVal.ToString().Trim(), txtUserName.Text.ToString().Trim(), txtPassword.Text.ToString(), txtDomain.Text.ToString(), dtAssetValues, chkImpersonate.Checked, recordnumber)); wmithread.Start(); wmithread.Join(); }
That wouldn't help. The problem is this:
superselector wrote:
wmithread.Start(); wmithread.Join();
That's like calling that ping operation without a thread, except this way resources are wasted as well. Or to put it differently, it's like hiring a team to play a game of monopoly, in order to do it faster. That doesn't work. If everyone takes turns anyway, you might as well do it by yourself. You need an array of threads. Fill the array, start them all, then, and only then, join them all. Besides, what's with the WMI stuff? Do you need something that the Ping class[^] can't do?
-
That wouldn't help. The problem is this:
superselector wrote:
wmithread.Start(); wmithread.Join();
That's like calling that ping operation without a thread, except this way resources are wasted as well. Or to put it differently, it's like hiring a team to play a game of monopoly, in order to do it faster. That doesn't work. If everyone takes turns anyway, you might as well do it by yourself. You need an array of threads. Fill the array, start them all, then, and only then, join them all. Besides, what's with the WMI stuff? Do you need something that the Ping class[^] can't do?
can you please give a sample code to implement this
-
can you please give a sample code to implement this
-
Ok.. it's not that hard though.
Thread[] threads = new Thread[something];
for (int i = 0; i < threads.Length; i++)
{
threads[i] = new Thread(something);
threads[i].Start();
}
for (int i = 0; i < threads.Length; i++)
threads[i].Join();hi with this approach , I am missing data .. means i am not getting output for all the IPs
-
Ok.. it's not that hard though.
Thread[] threads = new Thread[something];
for (int i = 0; i < threads.Length; i++)
{
threads[i] = new Thread(something);
threads[i].Start();
}
for (int i = 0; i < threads.Length; i++)
threads[i].Join();The ip address is getting overlapped. Means two rows are having same ip address.
-
The ip address is getting overlapped. Means two rows are having same ip address.