[C#] MultiThreading Problem

0

Mam problem z multithreadingiem a mianowicie.

private void button1_Click(object sender, EventArgs e)
        {
            int numOf = 20;
            int mini = Convert.ToInt32(min.Text);
            int maxi = Convert.ToInt32(max.Text);
            for (int i = 0; i < numOf; i++)
            {
                ThreadStart start = delegate { Get(mini.ToString(), maxi.ToString() , i); };
                this.thread = new Thread(start);
                this.thread.Start();
            }
            
        }

Niby wszystko OK ale gdy zrobie prosty textbox, w którym pokazuje ID wątku to jest różnie, czasami ID się powtarzają.

public void Get(string min,string max, int id)
        {
         if (textBox.InvokeRequired)
                        {
                            textBox.BeginInvoke((MethodInvoker)delegate
                            {
                                textBox = textBox + id.toString() + " " + min + " " + max + "/n";

                            });
                        }

W czym problem [???] [???]

0

for (int i = 0; i < numOf; i++)
{
ThreadStart start = delegate { Get(mini.ToString(), maxi.ToString() , i); };
this.thread = new Thread(start);
this.thread.Start();
}

No raczej będą się powtarzać .. - tworzysz tyle wątków ile wynosi wartość numOf. W czym zatem problem?

0

W textboxie każdy wątek(Get) ma wpisać swoje ID przekazane w parametrach ale wtedy dodawane jest coś takiego:

2
2
3
4
5
6
7
7
9
10
10
11
12
14

itd.
powtarzają się. A każdy wątek dostaje inne parametry.

0

Jeszcze jedno.

Czy to możliwe, że gdy wywołuje tą samą funkcję jednocześnie z paru wątków to ta funkcja się pogubi i będzie wykorzystywać dane z wszystkich jednoczesnych wywołań np. przekazane z pierwszego wątku? Jest to funkcja private void

0

Po pierwsze daj rzeczywisty kod i rzeczywiste wyniki.

Czy to możliwe, że gdy wywołuje tą samą funkcję jednocześnie z paru wątków to ta funkcja się pogubi i będzie wykorzystywać dane z wszystkich jednoczesnych wywołań np. przekazane z pierwszego wątku?
Nie.

0

Twój delegat nie nadąża czytać parametrów .ToString() <-- zajmuje za dużo czasu, a w tym czasie i sie zmienia (to nie closure!)

Zamień:

for (int i = 0; i < numOf; i++)
            {
                ThreadStart start = delegate { Get(mini.ToString(), maxi.ToString() , i); };

na:

for (int i = 0; i < numOf; i++)
            {
                 int n=i;
                ThreadStart start = delegate { Get(mini.ToString(), maxi.ToString() , n); };

I zobaczysz różnice.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.