Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 296
  • Last Modified:

C# Multithreading Question

Hi ALl,

Here is my basis of completion:

1). run through text file filled with servers.
2). Connect to each server and check for shares
3). Use 10 threads to run through the list. I know 10 is an arbitrary number, but it was one I picked based on the # of servers I have.

When I run the code for the same share one of three results occur:

I will get the correct output
I will get duplicate output
I will get no output

It changes each time I run the code, so I am assuming that at least two threads are accessing the same variable at the sametime, just not sure how to get this fixed outside of using the lock() function. I read a bunch of C# Multithreading How-to's but for some reason its not happening for my code. Below is the code I am using:

public class ShareCheck
    {
        static string share;
        static void Main(string[] args)
        {
            String server = "";
            share = args[0];

            StreamReader file = new StreamReader("servers.txt");

            int n = 0;
            while ((server = file.ReadLine()) != null)
            {
                if (n == 0)
                {
                    Thread a = new Thread(() => CheckShare(server));
                    a.Start();
                }
                else if (n == 1)
                {
                    Thread b = new Thread(() => CheckShare(server));
                    b.Start();
                }
                else if (n == 2)
                {
                    Thread c = new Thread(() => CheckShare(server));
                    c.Start();
                }
                else if (n == 3)
                {
                    Thread d = new Thread(() => CheckShare(server));
                    d.Start();
                }
                else if (n == 4)
                {
                    Thread e = new Thread(() => CheckShare(server));
                    e.Start();
                }
                else if (n == 5)
                {
                    Thread f = new Thread(() => CheckShare(server));
                    f.Start();
                }
                else if (n == 6)
                {
                    Thread g = new Thread(() => CheckShare(server));
                    g.Start();
                }
                else if (n == 7)
                {
                    Thread h = new Thread(() => CheckShare(server));
                    h.Start();
                }
                else if (n == 8)
                {
                    Thread i = new Thread(() => CheckShare(server));
                    i.Start();
                }
                else if (n == 9)
                {
                    Thread j = new Thread(() => CheckShare(server));
                    j.Start();
                    n = 0;
                }
                else
                    n++;

            }
        }

        static void CheckShare(String server)
        {
            Process p = new Process();
            p.StartInfo.FileName = "share.exe";
            p.StartInfo.Arguments = "\\\\" + server + "\\" + share + "$";
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardOutput = true;
            p.Start();

            lock (server)
            {
                p.WaitForExit();
                if (p.StandardOutput.ReadToEnd().IndexOf("completed successfully") > -1)
                {
                    Console.WriteLine("\\\\" + server + "\\" + share + "$");
                }
            }
            server = "";
        }

Open in new window

0
tr57285
Asked:
tr57285
  • 2
1 Solution
 
käµfm³d 👽Commented:
Why even have the share static variable? It's just a string, so the cost of passing it is minimal. I suggest passing what you normally store in share as a parameter to each thread. In this way, you don't have any global variable access, and thus there will be no need for locking.

e.g.

public class ShareCheck
{
    static void Main(string[] args)
    {
        String server = "";
        String share = args[0];

        StreamReader file = new StreamReader("servers.txt");

        int n = 0;
        while ((server = file.ReadLine()) != null)
        {
            if (n == 0)
            {
                Thread a = new Thread(() => CheckShare(server, share));
                a.Start();
            }
            else if (n == 1)
            {
                Thread b = new Thread(() => CheckShare(server, share));
                b.Start();
            }
            else if (n == 2)
            {
                Thread c = new Thread(() => CheckShare(server, share));
                c.Start();
            }
            else if (n == 3)
            {
                Thread d = new Thread(() => CheckShare(server, share));
                d.Start();
            }
            else if (n == 4)
            {
                Thread e = new Thread(() => CheckShare(server, share));
                e.Start();
            }
            else if (n == 5)
            {
                Thread f = new Thread(() => CheckShare(server, share));
                f.Start();
            }
            else if (n == 6)
            {
                Thread g = new Thread(() => CheckShare(server, share));
                g.Start();
            }
            else if (n == 7)
            {
                Thread h = new Thread(() => CheckShare(server, share));
                h.Start();
            }
            else if (n == 8)
            {
                Thread i = new Thread(() => CheckShare(server, share));
                i.Start();
            }
            else if (n == 9)
            {
                Thread j = new Thread(() => CheckShare(server, share));
                j.Start();
                n = 0;
            }
            else
                n++;

        }
    }

    static void CheckShare(String server, String share)
    {
        Process p = new Process();
        p.StartInfo.FileName = "share.exe";
        p.StartInfo.Arguments = "\\\\" + server + "\\" + share + "$";
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardOutput = true;
        p.Start();

        p.WaitForExit();

        if (p.StandardOutput.ReadToEnd().IndexOf("completed successfully") > -1)
        {
            Console.WriteLine("\\\\" + server + "\\" + share + "$");
        }
    }
}

Open in new window

0
 
käµfm³d 👽Commented:
You might prefer a LINQ-based approach also:

using System;
using System.Diagnostics;
using System.IO;
using System.Linq;

namespace ConsoleApplication105
{
    public class ShareCheck
    {
        static void Main(string[] args)
        {
            String share = args[0];

            File.ReadLines("servers.txt")
                .AsParallel()
                .ForAll(server => CheckShare(server, share));
        }

        static void CheckShare(String server, String share)
        {
            Process p = new Process();
            p.StartInfo.FileName = "share.exe";
            p.StartInfo.Arguments = "\\\\" + server + "\\" + share + "$";
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardOutput = true;
            p.Start();

            p.WaitForExit();

            if (p.StandardOutput.ReadToEnd().IndexOf("completed successfully") > -1)
            {
                Console.WriteLine("\\\\" + server + "\\" + share + "$");
            }
        }
    }
}

Open in new window

0

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now