Каждому потоку - уникальный объект

Gor

Client
Регистрация
30.09.2016
Сообщения
250
Реакции
30
Баллы
28
Приветствую!
Решал задачку целый день, не получилось :( Хэлп :-))

Нужно создать объект класса Person.
Чтобы объект был доступен из любого кубика проекта.
Чтобы объект был уникальным для каждого потока.

В процессе решения получилось 4 неверных варианта.
Вариант 1
Общий код:
Код:
Развернуть Свернуть Копировать
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using System.Text.RegularExpressions;
using ZennoLab.CommandCenter;
using ZennoLab.InterfacesLibrary;
using ZennoLab.InterfacesLibrary.ProjectModel;
using ZennoLab.InterfacesLibrary.ProjectModel.Collections;
using ZennoLab.InterfacesLibrary.ProjectModel.Enums;
using ZennoLab.Macros;
using Global.ZennoExtensions;
using ZennoLab.Emulation;
using Newtonsoft;

namespace ZennoLab.OwnCode
{
    public static class CommonCode
    {
        public static object SyncObject = new object();
    }
    public class Person
    {
        public int Age { get; set; }
        public string Name { get; set; }
        public string Surname { get; set; }
    }
}
1 снипет:
Код:
Развернуть Свернуть Копировать
Random rand = new Random();
Person person1 = new Person();

person1.Age = rand.Next(0,10000000);
project.Context["Person"] = person1;

2 снипет:

Код:
Развернуть Свернуть Копировать
Person person1 = project.Context["Person"];

project.SendInfoToLog(person1.Age.ToString(),true);
Thread.Sleep(10000);

Результат работы шаблона в 4 потока: http://prntscr.com/mgoc5s

Person.Age повторяются, не смотря на то, что были сгенерированы рэндомно.


Вариант 2
using:
Код:
Развернуть Свернуть Копировать
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using System.Text.RegularExpressions;
using ZennoLab.CommandCenter;
using ZennoLab.InterfacesLibrary;
using ZennoLab.InterfacesLibrary.ProjectModel;
using ZennoLab.InterfacesLibrary.ProjectModel.Collections;
using ZennoLab.InterfacesLibrary.ProjectModel.Enums;
using ZennoLab.Macros;
using Global.ZennoExtensions;
using ZennoLab.Emulation;
using Newtonsoft;

namespace ZennoLab.OwnCode
{
    public static class CommonCode
    {
        public static object SyncObject = new object();
        [ThreadStatic] public static List<Person> PersonList = new List<Person>();
    }
    public class Person
    {
        public int Age { get; set; }
        public string Name { get; set; }
        public string Surname { get; set; }
    }
}
1 снипет:

Код:
Развернуть Свернуть Копировать
List<Person> PersonList = ZennoLab.OwnCode.CommonCode.PersonList;
Person person1 = new Person();
person1.Age = new Random().Next(0,1000000);
PersonList.Add(person1);

2 снипет:

Код:
Развернуть Свернуть Копировать
List<Person> PersonList = ZennoLab.OwnCode.CommonCode.PersonList;
Person person1 = PersonList[0];
project.SendInfoToLog(person1.Age.ToString(),true);
Thread.Sleep(5000);

Результат работы шаблона в 4 потока: http://prntscr.com/mgof20
Проект выполняется лишь иногда.

Вариант 3
Общий код:
Код:
Развернуть Свернуть Копировать
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using System.Text.RegularExpressions;
using ZennoLab.CommandCenter;
using ZennoLab.InterfacesLibrary;
using ZennoLab.InterfacesLibrary.ProjectModel;
using ZennoLab.InterfacesLibrary.ProjectModel.Collections;
using ZennoLab.InterfacesLibrary.ProjectModel.Enums;
using ZennoLab.Macros;
using Global.ZennoExtensions;
using ZennoLab.Emulation;
using Newtonsoft;

namespace ZennoLab.OwnCode
{
    public static class CommonCode
    {
        public static object SyncObject = new object();
    }
    public static class Person
    {
        public static int Age { get; set; }
        public static string Name { get; set; }
        public static string Surname { get; set; }
    }
}
1 снипет:

Код:
Развернуть Свернуть Копировать
Random rand = new Random();
Person.Age = rand.Next(0,10000000);

2 снипет:

Код:
Развернуть Свернуть Копировать
project.SendInfoToLog(Person.Age.ToString(),true);
Thread.Sleep(10000);

Результат работы шаблона в 4 потока:
http://prntscr.com/mgohnr
http://prntscr.com/mgoia4

Person.Age повторяются, не смотря на то, что были сгенерированы рэндомно.


Вариант 4

Общий код:
Код:
Развернуть Свернуть Копировать
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using System.Text.RegularExpressions;
using ZennoLab.CommandCenter;
using ZennoLab.InterfacesLibrary;
using ZennoLab.InterfacesLibrary.ProjectModel;
using ZennoLab.InterfacesLibrary.ProjectModel.Collections;
using ZennoLab.InterfacesLibrary.ProjectModel.Enums;
using ZennoLab.Macros;
using Global.ZennoExtensions;
using ZennoLab.Emulation;
using Newtonsoft;

namespace ZennoLab.OwnCode
{
    public static class CommonCode
    {
        public static object SyncObject = new object();
    }
    public class Person
    {
        public int Age { get; set; }
        public string Name { get; set; }
        public string Surname { get; set; }
    }
}
1 снипет:

Код:
Развернуть Свернуть Копировать
Random rand = new Random();
Person person1 = new Person();
List<Person> PersonList = new List<Person>();

person1.Age = rand.Next(0,10000000);
PersonList.Add(person1);
project.Context["PersonList"] = PersonList;

2 снипет:

Код:
Развернуть Свернуть Копировать
List<Person> PersonList = project.Context["PersonList"];
Person person1 = PersonList[0];
project.SendInfoToLog(person1.Age.ToString(),true);
Thread.Sleep(5000);

Результат работы шаблона в 4 потока:
http://prntscr.com/mgolbr


Person.Age повторяются, не смотря на то, что были сгенерированы рэндомно.


Я даже dll написал с отдельным классом Person, со своим листом, с методами и без методов. Все то же самое...


Это ППЦ, товарищи... Я не прогер, я только учусь. Не пинайте сильно ) И так весь день промаялся )
 
Последнее редактирование:
Если проблема с рандомом то ответ а этом видео
 
  • Спасибо
Реакции: Gor
Если проблема с рандомом то ответ а этом видео
Спасибо большое! Проблема в рэндоме. Никогда бы не подумал. Оказывается генерируются ПСЕВДОслучайные числа рэндомом по формуле, которая зависит от времени инициализации рэндома. Волосатов нормальный парень! Есть его видеоуроки в общем доступе? Одно время интересовался его подходом к обучению и его обучающей программой.
Сделал так:
Код:
Развернуть Свернуть Копировать
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using System.Text.RegularExpressions;
using ZennoLab.CommandCenter;
using ZennoLab.InterfacesLibrary;
using ZennoLab.InterfacesLibrary.ProjectModel;
using ZennoLab.InterfacesLibrary.ProjectModel.Collections;
using ZennoLab.InterfacesLibrary.ProjectModel.Enums;
using ZennoLab.Macros;
using Global.ZennoExtensions;
using ZennoLab.Emulation;
using Newtonsoft;

namespace ZennoLab.OwnCode
{
    public static class CommonCode
    {
        public static object SyncObject = new object();
        public static Random random = new Random();
    }
    class Person
    {
        public int Age { get; set; }
        public string Name { get; set; }
        public string Surname { get; set; }
        public Person()
        {
            Age = CommonCode.random.Next(0,10000000);
            Name = "John";
            Surname = "Smith";
        }
    }
}

Резуальтат: http://prntscr.com/mgvk0n
Спасибо! Но как-то слишком мудренно для генерации обычного случайного числа, хотя тоже вариант хороший, уверен.
 
Почесал маковку, нарисовал видео своих мытарств под музычку. Спасибо Дмитрию Коломийцу, @Zymlex , @SoUp1 за консультации.

 
  • Спасибо
Реакции: Yuriy Zymlex
@Gor Кстати, что бы не таскать с собой либу Newtonsoft.Json, можно использовать встроенную в зенку:
Global.ZennoLab.Json.JsonConvert
 
  • Спасибо
Реакции: Alex733 и Gor
как-то слишком мудренно для генерации обычного случайного числа
Тогда, кратко и надёжно будет так:
C#:
Развернуть Свернуть Копировать
new Random(Guid.NewGuid().GetHashCode())
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)