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

Gor

Client
Joined
Sep 30, 2016
Messages
250
Reaction score
30
Points
28
Приветствую!
Решал задачку целый день, не получилось :( Хэлп :-))

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

В процессе решения получилось 4 неверных варианта.
Вариант 1
Общий код:
Code:
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 снипет:
Code:
Random rand = new Random();
Person person1 = new Person();

person1.Age = rand.Next(0,10000000);
project.Context["Person"] = person1;
2 снипет:

Code:
Person person1 = project.Context["Person"];

project.SendInfoToLog(person1.Age.ToString(),true);
Thread.Sleep(10000);
Результат работы шаблона в 4 потока: http://prntscr.com/mgoc5s

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


Вариант 2
using:
Code:
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 снипет:

Code:
List<Person> PersonList = ZennoLab.OwnCode.CommonCode.PersonList;
Person person1 = new Person();
person1.Age = new Random().Next(0,1000000);
PersonList.Add(person1);
2 снипет:

Code:
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
Общий код:
Code:
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 снипет:

Code:
Random rand = new Random();
Person.Age = rand.Next(0,10000000);
2 снипет:

Code:
project.SendInfoToLog(Person.Age.ToString(),true);
Thread.Sleep(10000);
Результат работы шаблона в 4 потока:
http://prntscr.com/mgohnr
http://prntscr.com/mgoia4

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


Вариант 4

Общий код:
Code:
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 снипет:

Code:
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 снипет:

Code:
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, со своим листом, с методами и без методов. Все то же самое...


Это ППЦ, товарищи... Я не прогер, я только учусь. Не пинайте сильно ) И так весь день промаялся )
 
Last edited:

SoUp1

Client
Joined
Sep 15, 2013
Messages
150
Reaction score
47
Points
28
Если проблема с рандомом то ответ а этом видео
 
  • Thank you
Reactions: Gor

Gor

Client
Joined
Sep 30, 2016
Messages
250
Reaction score
30
Points
28
Если проблема с рандомом то ответ а этом видео
Спасибо большое! Проблема в рэндоме. Никогда бы не подумал. Оказывается генерируются ПСЕВДОслучайные числа рэндомом по формуле, которая зависит от времени инициализации рэндома. Волосатов нормальный парень! Есть его видеоуроки в общем доступе? Одно время интересовался его подходом к обучению и его обучающей программой.
Сделал так:
Code:
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
Пробуй так:
Спасибо! Но как-то слишком мудренно для генерации обычного случайного числа, хотя тоже вариант хороший, уверен.
 

Gor

Client
Joined
Sep 30, 2016
Messages
250
Reaction score
30
Points
28
Почесал маковку, нарисовал видео своих мытарств под музычку. Спасибо Дмитрию Коломийцу, @Zymlex , @SoUp1 за консультации.

 
  • Thank you
Reactions: Yuriy Zymlex

Yuriy Zymlex

Client
Joined
Oct 23, 2016
Messages
6,713
Reaction score
3,478
Points
113
@Gor Кстати, что бы не таскать с собой либу Newtonsoft.Json, можно использовать встроенную в зенку:
Global.ZennoLab.Json.JsonConvert
 
  • Thank you
Reactions: Alex733 and Gor

Gor

Client
Joined
Sep 30, 2016
Messages
250
Reaction score
30
Points
28
можно использовать встроенную в зенку:
Global.ZennoLab.Json.JsonConvert
Спасибо! Уже нашел, пробую ) Очень в тему!
 

Yuriy Zymlex

Client
Joined
Oct 23, 2016
Messages
6,713
Reaction score
3,478
Points
113
как-то слишком мудренно для генерации обычного случайного числа
Тогда, кратко и надёжно будет так:
C#:
new Random(Guid.NewGuid().GetHashCode())
 

Users Who Are Viewing This Thread (Total: 1, Members: 0, Guests: 1)