[C#] wielowątkowość

0

Witam,

public class Pom
    {
        public int port;
        public List<int> lista = new List<int>();
            public Pom()
            {
                port = 0;
            }
    }

public class Pierwsza
    {
        private Pom pomo;

        public PortScan(Pom Pomo)
		{
			pomo = Pomo;
		}

        public void Start()
        {
            var bw = new BackgroundWorker();
            bw.DoWork += new DoWorkEventHandler(bw_DoWork);
            bw.RunWorkerAsync();
        }

        private void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            if(!pomo.lista.Contains(pomo.port))
				pomo.lista.Add(pomo.port);
        }
    }

public class Glowna
	{
		private Pom pomoc = new Pom();
		int nThreadCount;
		
		Glowna()
		{
			nThreadCount = 100;
		}
		
		private void Dzialaj()
        {
            scan = new Pierwsza[nThreadCount];
            for (int a = 0; a < scan.Length; a++)
            {
                scan[a] = new Pierwsza(pomoc);
                scan[a].Start();
            }

        }
	}

Klasa Glowna tworzy nThreadCount obiektów klasy Pierwsza przekazując im obiekt klasy Pom. Jak zabezpieczyć dostęp do lista, żeby nie były dodawane dublowane elementy? Gdybym stworzył nThreadCount wątków Pierwsza.Start() to mógłbym zabezpieczyć monitorem:

Monitor.Enter(this);
            if(!pomo.lista.Contains(pomo.port))
				pomo.lista.Add(pomo.port++);
           Monitor.Exit(this);

Ale jest to stworzone na obiektach + BW. Jakiś pomysł?

0
  public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Glowna gl = new Glowna();
            gl.Dzialaj();
        }
    }

    public class Pom
    {
        public int port;
        public volatile List<int> lista = new List<int>();
        public Pom()
        {
            port = 0;
        }
    }

    public class Pierwsza
    {
        private Pom pomo;

        public Pierwsza(Pom Pomo)
        {
            pomo = Pomo;
        }

        public void Start()
        {
            var bw = new BackgroundWorker();
            bw.DoWork += new DoWorkEventHandler(bw_DoWork);
            bw.RunWorkerAsync();
        }

        private void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            Monitor.Enter(this);
            if (!pomo.lista.Contains(pomo.port))
                pomo.lista.Add(pomo.port++);
            Monitor.Exit(this);
        }
    }

    public class Glowna
    {
        private Pom pomoc = new Pom();
        int nThreadCount;
        private Pierwsza[] scan;


        public Glowna()
        {
            nThreadCount = 100;
            scan = new Pierwsza[nThreadCount];
        }

        public void Dzialaj()
        {
            for (int a = 0; a < scan.Length; a++)
            {
                scan[a] = new Pierwsza(pomoc);
                scan[a].Start();
            }

        }
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1