0

Есть код:

class Program
{
    static void Main(string[] args)
    {
        Сalculator calc = new Сalculator(3);
        Console.ReadKey();

    }
}
public class Сalculator
{
    public List<Info> result;
    private double Start_x;
    Thread task1;
    Thread task2;
    public Object locker = new object();

    public Сalculator(double Start_X)
    {
        this.Start_x = Start_X;
        result = new List<Info>();
        task1 = new Thread(Result);
        task2 = new Thread(Shoow);
        task1.Start();
        task2.Start();

    }

    public void Result()
    {
        while (true)
        {
            lock (locker)
            {
                double y = 23 * Math.Pow(Start_x, 2) - 23;
                Add_To_Collection(Start_x, y);
            }
            Thread.Sleep(500);
        }
    }
    public void Shoow()
    {
        while (true)
        {
            lock (locker)
            {
                Console.WriteLine(result[result.Count - 1].ToString());
                Start_x += 0.1;
                Thread.Sleep(1000);
            }
        }
    }

    public void Add_To_Collection(double X, double Y)
    {
        result.Add(new Info(X,Y));
    }
}

Я разобрался с тем, что если мне необходимо работать с 1 объектом(в моём случае это коллекцией), мне необходимо создать объект и блокировать с начало в 1 потоке, потом в 2, что бы данные поступали и выходили корректно, один за другим. Но если я уберу Thread.Slep всё совершенно рушится( и выводится беспорядочно. как это возможно исправить. Либо есть более простая вариация реализации много поточности в моём случае.

Valera
  • 191
  • вы пытаетесь выехать на таймингах, когда вам нужен producer-consumer – tym32167 Mar 26 '19 at 10:08
  • @tym32167, да, я это понимаю, но не понимаю почему так получается. Если я "забрал объект" не даю ему доступ, 2 поток должен ждать освобождения. Освободил, 2 поток взял его 1 поток стоит. Почему так не происходит, либо я не правильно понял? – Valera Mar 26 '19 at 10:13
  • если я верно помню (так тчо сами перепроверье это), но lock не дает вам очереди. То есть вот есть 2 потока, оба ждут lock секцию, который из них начнет обрабатываться первым, когда lock освободится? Ответ - любой, никакой очереди тут нет. То есть у вас потоки могут чередоваться как и 1-2-1-2-1, так и 1-1-1-2-2-1-1. Когда вы добавили Thread.Sleep(500);, то вы даете время второму потоку зайти в lock, пока первый ждет конца таймера. Поэтому у вас после 1 всегда идет 2, но вот после 2 что пойдет - опять не определено. (1 = Result(), 2=Shoow()) – tym32167 Mar 26 '19 at 10:22
  • @tym32167, спасибо большое – Valera Mar 26 '19 at 10:25
  • На здоровье :-) – tym32167 Mar 26 '19 at 10:28
  • @Grundy, я правильно понял в """ – Valera Mar 26 '19 at 19:36
  • @Grundy, я прочитал все реализации какие там есть, вот, что я понял, но не факт что правильно, по 1 реализации, которая более мне понятна: понял, что у нас есть очередь потоков основной, 1 и 2 созданные. Созданные вызываются по очереди, этой очередью "управляет" наша коллекция, НО, я не понимаю до сих пор, как же мне реализовать, что бы в двух созданных потоках, в 1 производить расчёты и записывать в коллекцию, а в 2 потоке выводить эту информацию на консоль(((( – Valera Mar 26 '19 at 20:20
  • Так непонятно, что за 1 реализация. – Grundy Mar 27 '19 at 17:17
  • @Grundy, называется «Реализация С#» – Valera Mar 27 '19 at 17:18
  • Через BlockingCollection? Там вроде @VladD уже пояснил :) – Grundy Mar 27 '19 at 17:19
  • @Grundy , дада) я уже тучу информации прочитал) осталось уложить по полкам. Спасибо и тебе за помощь)) – Valera Mar 27 '19 at 17:20

0 Answers0