Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.84/32: Рейтинг темы: голосов - 32, средняя оценка - 4.84
-39 / 2 / 1
Регистрация: 21.09.2015
Сообщений: 58
.NET 4.x

Инструмент многопоточного программирования

22.09.2015, 12:18. Показов 6641. Ответов 74
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Программирование многопоточных приложений крайне непростое дело. Приходится обходить много подводных камней: учитывать гонки, взаимоблокировки и др. Специально для облегчения разработки программ создан инструмент, с помощью которого эти затруднения легко разрешимы. Инструмент представляет собой библиотеку классов, написанную на C# и включающую достаточное количество методов, позволяющих просто писать довольно сложные многопоточные приложения. Всем, кто интересуется созданием параллельных программ, эта библиотека классов способна в значительной степени облегчить написание кода.
Если будут какие-то вопросы, с удовольствием отвечу. А также буду весьма признателен за выявленные недостатки.

Программное обеспечение исполняющей среды представлено классами пространства имен – BindingAndServisParallel.
Полная документация, библиотека классов и пример хранятся: sites.google.com/site/algonauts/Home/fajly
в файлах DocCoreParallel.docx, BindingAndServisCoreParallel_dll.dll, main.cs.
Пример компилируется в среде Visual Studio 2010 Express на 64-х битной платформе. При компиляции проекта следует добавить ссылки:
BindingAndServisCoreParallel_dll, PresentationCore, PresentationFramework, System, System.Xaml, WindowsBase

Библиотеку классов BindingAndServisCoreParallel_dll версия сборки 0.0.0.1 можно использовать без ограничения в любых целях. 
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.09.2015, 12:18
Ответы с готовыми решениями:

Создание многопоточного приложения
Делаю многопоточное приложение. Смысл в том, что в главном потоке надо изменять внутреннее состояние классов, которые выполняются в других...

Оптимальная реализация многопоточного приложения
Несколько простоватая проблема. Есть приложение, в нём пользователь запускает длительный процесс, и нужно, чтобы была возможность...

Ведение лога для многопоточного приложения
Всем привет! Задача состоит вот в чем: Создаются потоки, выполняющие какие то операции(сейчас это не важно). На главной форме есть...

74
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
22.10.2015, 11:19
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Dedoc Посмотреть сообщение
Это дедушкины валенки, выбросите все это из головы и пользуйтесь современными средствами многопоточности.
Это вот это, чтоль современное средство многопоточности?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  if (CoreParallel.units[index1].IsReady == 0)
                                          goto label_322;
                                      }
                                      else
                                        goto label_322;
                                    }
                                    else
                                      goto label_322;
                                  }
                                  else
                                    goto label_322;
                                }
                                else
                                  goto label_322;
                              }
                              else
                                goto label_322;
                            }
                            else
                              goto label_322;
                          }
                          else
                            goto label_322;
                        }
                        else
                          goto label_322;
                      }
                      else if (CoreParallel.units[index1].IsReady != 0)...
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
22.10.2015, 11:39
Dedoc, ну дык для массива интов большего и не надо. Или предлагается этот класс копипастить для массива каждого типа? Ведь в примере выше сортируются только инты...
0
-39 / 2 / 1
Регистрация: 21.09.2015
Сообщений: 58
22.10.2015, 12:37  [ТС]
Цитата Сообщение от GarretShadow Посмотреть сообщение
Концепция применения юнитов немного непривычна, на что посоветуете обратить внимание, от кода просто пестрит в глазах?
Шаблон № 1. Обмен сообщениями между юнитами
Следующее, на что следует обратить внимание, - обмен сообщениями между юнитами. Сообщение напоминает почтовый обмен. У каждого юнита есть свой почтовый ящик. Разделение по отдельным ящикам больше для удобства и структуризации обмена. Почтовый ящик юнита не защищен, доступ свободен для всех юнитов системы. Каждый юнит может посылать письма любым другим юнитам, так и получать от них письма. Особенностью принятого обмена информацией является потокобезопасность и безотказность работы почтовой службы. Даже в условиях очень интенсивного обмена письмами, представьте, одновременно отсылаются десятки тысяч писем от сотен юнитов по разным адресам – гарантируется корректная доставка корреспонденции.
Письмо не чистый лист бумаги, больше напоминает формуляр. Как и в обычном письме есть места обязательные для заполнения: адрес, кому, от кого, так и свободное поле, т.е само письмо; так и в сообщении есть обязательные для заполнения поля и поля для свободного обмена информацией. Формуляр представлен классом

[CSHARP]

Пользователь может заполнить только эту форму и закрепить ее за письмом, после этого письмо считается готовым к использованию. Шаблон подготовки и отправления письма выглядит так:






C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class UserFormMail
       {
         public int           FromUnit=-1;  // откуда, номер юнита
         public int           ToUnit=-1;  // куда, номер юнита
         public string        Tema =null; // тема сообщения
         public string        Comment=null; // комментарий
         public string        Free=null; // свободное поле для дополнительной информации
         public Type          TypeMail=null;   // тип передаваемой информации
         public object        ContainerMail=null; // контейнер  передаваемой информации
         public object        TypeContainerMail=null; // тип контейнера
         public object        SizeContainerMail=null; // размер контейнера
         public object        FreeContainerMail=null;// свободное поле для дополнительного описания иформации и ее упаковки
         public Uri           UriMail=null; // адрес ресурса
         public Url           UrlMail=null; // Url ресурса
         public object        PathMail=null;// путь к файлу данных
         public string        Type=null;  // тип передаваемой информации
         public string        Category=null; // категория сообщения
         public object        CryptoKey=null;// ключ шифрования
         public object        CryptoAlgoritm=null; // алгоритм шифрования
         public object        CryptoMetod=null; // метод шифрования
         public long          Metka=-1;  // поле хранения уникальной метки, служит для получения единичного письма для  пользователя
         public               Func<object,object> Func=null;
         public object        FuncArgument=null;
         public object        UserData=null;  // свободное поле для размещения произвольной информации
         public  object       Mail=null; // содержание сообщения
Несмотря на множество полей реально нужны немногие.
Поля письма заполняются не напрямую. Вначале нужно заполнить форму пользователя, представленную классом
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class UserFormMail
       {
         public int           FromUnit=-1;  // откуда, номер юнита
         public int           ToUnit=-1;  // куда, номер юнита
         public string        Tema =null; // тема сообщения
         public string        Comment=null; // комментарий
         public string        Free=null; // свободное поле для дополнительной информации
         public Type          TypeMail=null;   // тип передаваемой информации
         public object        ContainerMail=null; // контейнер  передаваемой информации
         public object        TypeContainerMail=null; // тип контейнера
         public object        SizeContainerMail=null; // размер контейнера
         public object        FreeContainerMail=null;// свободное поле для дополнительного описания иформации и ее упаковки
         public Uri           UriMail=null; // адрес ресурса
         public Url           UrlMail=null; // Url ресурса
         public object        PathMail=null;// путь к файлу данных
         public string        Type=null;  // тип передаваемой информации
         public string        Category=null; // категория сообщения
         public object        CryptoKey=null;// ключ шифрования
         public object        CryptoAlgoritm=null; // алгоритм шифрования
         public object        CryptoMetod=null; // метод шифрования
         public long          Metka=-1;  // поле хранения уникальной метки, служит для получения единичного письма для  пользователя
         public               Func<object,object> Func=null;
         public object        FuncArgument=null;
         public object        UserData=null;  // свободное поле для размещения произвольной информации
         public  object       Mail=null; // содержание сообщения

Пользователь может заполнить только эту форму и закрепить ее за письмом, после этого письмо считается готовым к использованию. Шаблон подготовки и отправления письма выглядит так:


C#
1
2
3
4
5
6
7
8
9
10
11
12
// создание письма
CoreParallel.IdentificationMail     idMail = CoreParallel.units[myUnit].unitMailSender.CreateMail();
// создание пользовательской формы
CoreParallel.UserFormMail ufm = new CoreParallel.UserFormMail();
// заполнение обязательных полей
ufm.FromUnit=myUnit;  
ufm.ToUnit=0;
ufm.Mail= (object) ”Это текст письма”
// прикрепление  формы к письму
CoreParallel.units[myUnit].unitMailSender.SetUserDataMail(idMail.IdNumberMail,ufm);
// отправка письма в ящик юнита адресата   
 CoreParallel.units[myUnit].unitMailSender.SendMail(idMail);

Вся процедура совершенно шаблонна. Подготовьте одно письмо, а для других писем меняйте значение полей.
Следующий способ отправки письма – называется пакетная рассылка - более быстрый.
Шаблон выглядит так:


C#
1
2
3
4
5
6
7
8
9
10
11
12
// объявляется массив форм письма
CoreParallel.UserFormMail[] ufmArray = new CoreParallel.UserFormMail[1];
// создается форма одного письма или нескольких для пакетной рассылки
CoreParallel.UserFormMail    ufm = new CoreParallel.UserFormMail();
// в каждой форме заполняются обязательные поля
ufm.FromUnit=myUnit;  
ufm.ToUnit=id3; 
// в массив форм добавляется конкретное письмо или несколько
ufmArray[0]=ufm;
// отправляется пачка писем от юнита myUnit различным адресатам в ассинхронном режиме
CoreParallel.units[myUnit].unitMailSender.SetAndSendUserDataMailArray(ufmArray,0);
//public   void  SetAndSendUserDataMailArray( UserFormMail[] userFormMailArray , int mode )//  mode=0 - асинхроный режим

Второй способ рассылки быстрее первого, особенно при пакетной рассылке.
Почтовый обмен являются способом обмена информацией между юнитами. Юнит, заинтересованный в получении информации должен приостановить работу по команде ожидания письма


C#
1
public  void  WaitMail (int myUnit);
Как только в его ящике появится письмо, юнит выйдет из режима ожидания. Далее он должен прочитать одно письмо или все письма и в зависимости от полученной информации предпринять те или иные действия, согласно пользовательской модели взаимодействия юнитов.

Добавлено через 3 минуты
Цитата Сообщение от Psilon Посмотреть сообщение
ну дык для массива интов большего и не надо. Или предлагается этот класс копипастить для массива каждого типа? Ведь в примере выше сортируются только инты...
Пример выше, вообще шаблон для любых действий. Там, где идет сортировка в ядре, может стоять код убийственной силы. Естественно для массивов и списков есть встроенные процедуры сортировки.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
22.10.2015, 12:41
Dedoc, одно то, что в программе нет ни одного кастомного типа (зато есть 20 полей типа int/object) говорит о том, что вам еще есть чему учиться, прежде чем у вас получится написать достойную библиотечку такого масштаба.
0
-39 / 2 / 1
Регистрация: 21.09.2015
Сообщений: 58
22.10.2015, 13:11  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
одно то, что в программе нет ни одного кастомного типа (зато есть 20 полей типа int/object) говорит о том, что вам еще есть чему учиться, прежде чем у вас получится написать достойную библиотечку такого масштаба.

Вот прежде чем писать ерунду, нелишне подумать, что формуляр является стандартной формой обмена между всеми юнитами. Каждый юнит должен точно знать тип информации и естественно применяется система общих типов. А для отдельного типа информации предусмотрено поле
C#
1
public string        Type=null;  // тип передаваемой информации
пользуйтесь им на здоровье.
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
22.10.2015, 13:34
Цитата Сообщение от Dedoc Посмотреть сообщение
Шаблон № 1. Обмен сообщениями между юнитами
Следующее, на что следует обратить внимание, - обмен сообщениями между юнитами. Сообщение напоминает почтовый обмен. У каждого юнита есть свой почтовый ящик. Разделение по отдельным ящикам больше для удобства и структуризации обмена. Почтовый ящик юнита не защищен, доступ свободен для всех юнитов системы. Каждый юнит может посылать письма любым другим юнитам, так и получать от них письма. Особенностью принятого обмена информацией является потокобезопасность и безотказность работы почтовой службы. Даже в условиях очень интенсивного обмена письмами, представьте, одновременно отсылаются десятки тысяч писем от сотен юнитов по разным адресам – гарантируется корректная доставка корреспонденции.
Письмо не чистый лист бумаги, больше напоминает формуляр. Как и в обычном письме есть места обязательные для заполнения: адрес, кому, от кого, так и свободное поле, т.е само письмо; так и в сообщении есть обязательные для заполнения поля и поля для свободного обмена информацией. Формуляр представлен классом
TPL Dataflow может обеспечить потокобезопасный обмен ЛЮБЫМИ сообщениями между ЛЮБЫМИ как вы их называете - юнитами.
и там не нужно заполнять 20 полей.
0
-39 / 2 / 1
Регистрация: 21.09.2015
Сообщений: 58
22.10.2015, 14:18  [ТС]
Цитата Сообщение от Jupiter Посмотреть сообщение
и там не нужно заполнять 20 полей.
Здесь тоже не нужно заполнять 20 полей, если внимательно читали, пяток полей однако придется заполнить, но это крайне легко и интуитивно понятно.
Что касается TPL – библиотека общего плана, не уверен, что с ней будет проще работать.
0
-39 / 2 / 1
Регистрация: 21.09.2015
Сообщений: 58
27.10.2015, 11:31  [ТС]
Цитата Сообщение от GarretShadow Посмотреть сообщение
Концепция применения юнитов немного непривычна, на что посоветуете обратить внимание




Шаблон № 2. Потокобезопасное выполнение методов из юнитов

Юнит есть поток, поток может выполнять обращение к стороннему методу, т.е. методу определенному вне класса реализации потока. Если несколько юнитов одновременно обратятся к одному методу, может возникнуть конкурентная ситуация не распознаваемая операционной системой, что приведет к неправильному выполнению программы. Избежать этой ситуации можно с помощью методов класса RunMetod. В классе реализованы методы:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Выполнить метод типа  Func<object,object>  в потокобезопасном режиме синхронно.
public object RunMetodSync(  Func<object,object>  func,  object argument)
 
//Выполнить метод типа  Func<object,object>  в потокобезопасном режиме асинхронно
public void RunMetodAsync(  Func<object,object> func,object argument)
 
//Выполнить метод синхронно и уничтожить сохраненный аргумент
//Метод аналогичен RunMetodSync, после исполнения метода автоматически 
//уничтожается сохраненный аргумент метода, указанный с помощью  int index.
 
public object RunMetodSyncSafe(  Func<object,object> func,object argument, int index)   
 
//Аналогичен  RunMetodSyncSafe, выполняется асинхронно. Для этого метода 
//предварительное сохранение аргумента, а если он сложный, то и его отдельных
// частей, крайне желательно.
public void RunMetodAsyncSafe(  Func<object,object> func,object argument,int index)
Сигнатуры методов содержат в качестве входных аргументов ссылку на метод func типа Func<object,object> и формальный аргумент argument типа object. Это означает, что исполняемый из юнита метод должен быть приведен к такому виду, чтобы в качестве входных аргументов имел один формальный аргумент типа object и возвращал оператором return значение типа object. Оформленный в таком виде метод может использоваться для потокобезопасного выполнения. Метод должен принимает аргумент, особенность в том, что аргумент передается отдельно от метода. Второй формальный аргумент метода RunMetodSync( Func<object,object> func, object argument) как раз и есть этот самый аргумент для выполняемого метода. Во время исполнения пользовательского метода библиотека подставит его на место аргумента пользовательского метода.
Пример:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
static int X=0;
pablic int SummaUnSafe(int arg) {X=X+arg; return   X;} 
 
//в потокобезопасном варианте должен быть преобразован  к виду
pablic object Summa(object arg) {X=X+  (int)  arg; return  (object)  X;}  
// метод размещен в классе ClassForSumma
//Обращение к методу  int Y= summaUnSafe(100); заменяется шаблонным 
//вызовом метода класса RunMetod.
Int arg=100; 
object argument = (object)arg; // запаковали входной аргумент.
Func<object,object> summa = ClassForSumma.Summa; // получили экземпляр метода Summa
// шаблонный вызов метода в потокобезопасном режиме.
 CoreParallel.units[myUnit].unitRunMetod.RunMetodSync( summa,  argument);
//CoreParallel – класс исполнительной системы, поскольку метод
 //статический указывается название класса, а не его экземпляр, например, myCoreParallel;
//units[myUnit] – коллекция юнитов;
//myUnit – фактический параметр, передающийся в метод юнита при его исполнении.
//unitRunMetod.RunMetodSync – экземпляр метода класса RunMetod;
//summa -  экземпляр исполняемого метода;
//argument- аргумент метода summa, в данном случае число 100.
Для методов выполняющихся в асинхронном режиме рекомендуется использовать следующий метод потокобезопасного выполнения
C#
1
public void RunMetodAsyncSafe(  Func<object,object> func,object argument,int index)
Это метод отличается от остальных тем, что дополнительно передается переменная index типа int. Откуда она берется и зачем нужна? Возникает она следующим образом: организуется временное хранилище входного аргумента
C#
1
2
3
CoreParallel.units[myUnit].musor.Add(new System.Collections.Generic.List<object>());      
//и определяется место хранения
int index=  CoreParallel.units[myUnit].musor.Count-1;
Далее index передается третьим аргументом в методе потокобезопасного исполнения пользовательского метода. По выполнии пользовательского метода, временное хранилище автоматически уничтожается. Эта запись совершенно шаблонна и не требует никаких изменений.
Для чего нужно временное хранилище? В него записывается сам входной аргумент для временного хранения
C#
1
       CoreParallel.units[myUnit].musor[index].Add(argument);
Если входной аргумент имеет сложную структуру (многоярусная упаковка), добавляйте в хранилище все его составные части, хуже от этого не будет.


Что делать, если требуется выполнить в потокобезопасном режиме посторонний метод, предположим, метод из сторонней библиотеки. Этот метод не обязательно должен соблюдать сигнатуру метода потокобезопасного режима?
Такой метод следует обернуть методом с сигнатурой потокобезопасного режима и послать на исполнение.
Пример:
C#
1
2
3
4
5
6
7
8
//Пусть имеется популярный метод 
public  string MessageBox.Show(string  str);
//Заворачиваем его в обертку 
Public object My_MessageBoxShow(object arg)
{   string str = (string)arg;
MessageBox.Show(str);
return null;
}


Этот метод будет выполнен в потокобезопасном режиме методом класса RunMetod.

Таким образом достигается универсальность в подходе к потокобезопасному программированию многопоточных приложений. Любые методы можно исполнять потокобезопасно, соблюдая лишь некоторые стандартные приемы. С помощью класса RunMetod, можно легко создавать многопоточные приложения со степенью надежности кода однопоточных программ.
0
-39 / 2 / 1
Регистрация: 21.09.2015
Сообщений: 58
09.11.2015, 10:11  [ТС]
В связи с тем, что внесены серьезные коррективы в методы класса RunMetod, предыдущий пост следует считать утратившим значение. Вместо метода
C#
1
public object RunMetodSyncSafe
введены методы, не требующие предварительной упаковки аргумента и упрощающие синтаксис вызова.
C#
1
2
public  object Synchronous (   Func<object>  func)  
public  object Asynchronous (   Func<object>  func)
Класс RunMetod позволяет из потока выполнять методы в потокобезопасном режиме. Не рекомендуется выполнять методы длительного цикла, т.к. это может привести к задержке исполнения подобных методов из других потоков, что приведет к общей потере производительности. “Силовые” процедуры следует выполнять в методах юнитов, как часть их кода. Все клиентские методы имеют потокобезопасную модификацию, отличительным признаком которой является наличие суффикса Thread или DirectArgument в названии метода, в зависимости от того к какой группе методов этого класса они относятся. Эти методы можно исполнять только методами класса RunMetod из методов юнитов: F1, F2, F3 . Из методов юнита не следует выполнять внешние методы не в потокобезопасном режиме, т.к. это может привести к неправильной работе программы. Особая область применения методов класса – потокобезопасный доступ к одному источнику или приемнику данных из множества потоков. Методы могут выполняться как синхронно , так и в асинхронном режиме.

Все методы класса относятся к одной из двух групп: методы с неограниченым количеством аргументов, приведенных к виду одного аргумента и методы с ограниченным количеством аргументов.

1) К первой группе относятся методы RunMetodSync и RunMetodAsync, имеющие сигнатуру вида
C#
1
object RunMetodSync(  Func<object,object>  func,  object argument)

Первый аргумент – имя исполняемого синхронно или асинхронно пользовательского метода относящегося к типу Func<object,object>. Пользовательский метод должен принимать один аргумент типа object и возвращать значение того же типа.
Второй аргумент методов первой группы – аргумент пользовательского метода типа object.

Пример.
Пусть требуется потокобезопасно выполнить метод задающий значение аргумента методу юнита F2.
C#
1
int  SetArgumentToServer (int unit,  int numMetod,  object Argument)
Метод устанавливает юниту unit в метод с номером int numMetod ( значение от 1 до 3, для определенности пусть равен - 2) его аргумент object Argument. Потокобезопасный вариант этого пользовательского метода должен иметь вид:
C#
1
object SetArgumentToServerThread(object input)

Метод юнита F2 принимает аргумент object argument (первый по счету аргумент в списке определения метода, второй аргумент типа int зарезервирован для передачи, во время исполнения метода, номера юнита, третий аргумент – тип возвращаемого значения).

Func<object ,int, object>


Пусть этот аргумент типа object в упакованном виде представляет две переменные, для примера, как ссылки на исходный массив значений и обработанный массив значений: unSortedArray и sortedArray.

Упакуем эти две ссылки и приведем к виду одного аргумента, так как все методы юнитов могут принимать только один аргумент типа object.

Создадим массив из двух членов и инициализируем их значениями переменных.
C#
1
2
3
 object[] argument = new  object[2];            // массив переменных типа object
 argument[0]= (object) unSortedArray;      // исходный массив
 argument[1]= (object) sortedArray;           // отсортированный массив
Введем переменную типа object и инициализируем ее ссылкой на полученный массив
C#
1
object  arg = (object) argument;
Теперь переменная arg ссылается на массив, в котором расположены пользовательские переменные.

В самом методе юнита должно быть обратное преобразование к исходному виду переменных.
Пусть этот метод юнита имеет имя unitMetod2, тогда в самом начале этого метода должен располагаться код распаковки аргумента.
C#
1
2
3
4
5
 object unitMetod2( object myArgument )
{ object[] argument =(object[]) myArgument; // привели аргумент к виду массива объектов
  Int[] unSortedArray = (int []   )  myArgument[0];  // получили ссылку на первый массив значений
  Int[].sortedArray = (int [] )    myArgument[0];       // получили ссылку на второй массив значений
}
Итак, переменная arg содержит в запакованном виде два пользовательских объекта, а именно ссылки на входной и выходной массивы, относящиеся к методу юнита, и требуется установить это значение в качестве аргумента метода юнита с помощью метода установки значений аргумента

C#
1
object SetArgumentToServerThread(object arg)
Как видно этот метод принимает только один аргумент, а нужно передать три аргумента:
C#
1
int unit,  int numMetod,  object Argument
Следует упаковать эти три объекта к виду одного аргумента
C#
1
2
3
4
5
6
object[] argument1= new  object[3];        // массив переменных типа object
 argument1[0]= (object) unit;                      // номер юнита
 argument1[1]= (object) numMetod ;      // номер метода юнита
argument1[2]= (object) Argument ;           // ранее  упакованный аргумент метода юнита
 
object endArgument = (object) argument1;  //  конечный аргумент
Потокобезопасное выполнение метода производится методом RunMetodSync или RunMetodAsync в зависимости от того, выполнится ли метод сихронно или асинхронно.

Метод RunMetodSync класса RunMetod имеет вид:
C#
1
object RunMetodSync(  Func<object,object>  func, object argument)
Все аргументы к этому моменту определены, вызывается потокобезопасное выполнение метода SetArgumentToServer
C#
1
2
 CoreParallel.units[myUnit].unitRunMetod.RunMetodSync
                                           (SetArgumentToServerThread , endArgument);
CoreParallel – имя класса библиотеки BindingAndServiceCoreParallel. Используется имя класса, а не
имя экземпляра класса, так как этим именем квалифицируется статический член
класса units[myUnit].

units[myUnit] – член списка юнитов с номером myUnit.

myUnit – номер юнита на котором в данный момент исполняется пользовательский метод
F1, F2, или F3. Это значение передается исполнительной средой во время
выполнения метода через зарезервированный в сигнатуре метода юнита
аргумент int myUnit.


unitRunMetod.RunMetodSync – метод RunMetodSync экземпляра класса RunMetod.


SetArgumentToServerThread – первый аргумент метода RunMetodSync, представлен именем
исполняемого потокобезопасно метода.

endArgument – аргумент исполняемого потокобезопасно метода. Таким образом,
имя метода и его аргумент передаются отдельно в качестве аргументов
метода отвечающего за потокобезопасное исполнение заданного метода.


2) Методы второй группы класса RunMetod: Synchronous и Asynchronous позволяют потокобезопасно выполнять методы с ограниченным количеством аргументов, максимально – 16 и имеют более простой чем методы первой группы способ записи. Для примера вид метода с 16 аргументами.

C#
1
2
3
4
5
6
7
public object Synchronous( 
Func<object,object,object,object,object   ,object   ,object  ,object, object  , object , object  , object, object  , object, object, object, object>   func,
 
object argument1,     object argument2,     object argument3,     object argument4   ,
object argument5,     object argument6 ,    object argument7,     object argument8  ,
object argument9,     object argument10 ,  object argument11 ,  object argument12 ,
object argument13 ,  object argument14 ,  object argument15 ,  object argument16)
На первом месте в вызове метода стоит имя пользовательского метода с определенным количеством аргументов, далее значения самих аргументов , приведенных к типу object.

Предыдущий пример, с использованием методов второго типа будет выглядеть следующим образом. Собственно входные аргументы самого метода юнита придется упаковать, так как сигнатура методов юнита допускает только один аргумент.
C#
1
2
3
4
object[] argument = new  object[2];            // массив переменных типа object
argument[0]= (object) unSortedArray;      // исходный массив
argument[1]= (object) sortedArray;           // отсортированный массив
object arg = (object) argument;
Далее вызывается сам метод Synchronous.
C#
1
2
CoreParallel. units[myUnit]. unitRunMetod. Synchronous 
        (  SetArgumentToServerDirectArgument,   unitManager,  2 , argument );
Здесь аргументы передаются в естественном виде, без упаковки. Важно иметь ввиду, что, не смотря на то что чисто внешне аргументы передаются без приведения к типу object, это приведение автоматически производится компилятором программы. Поэтому в методе назначения все-равно потребуется обратное преобразование из типа object к естественному виду переменных. Метод SetArgumentToServerDirectArgument стандартный метод библиотеки и в нем выполнено преобразование переданных значений аргументов.
C#
1
2
3
4
Int unit= (int) argument1;
Int numberMetod = (int) ) argument2;
object  argumentForMetodF2= argument3;  -без преобразования типа, т.к. аргумент уже имеет  
                                                                  //                тип object.
В пользовательских методах нужно самостоятельно производить поочередное преобразование полученных входных аргументов из типа object в тип заданный при объявлении переменной.


В качестве совета, при параллельном программировании с использованием библитеки классов BindingAndServiceCoreParallel, имеет смысл пользовательские методы изначально оформлять с требованием вида метода для класса RunMetod. Такие методы будут универсальными, их можно исполнять как в потокобезопасном режиме, так и обычным образом.
Пример, метод считающий сумму аргументов
C#
1
int Summa(int x, int y) { return x+y;  }
лучше заранее записать в виде
C#
1
2
object Summa(object x, object y)
 {int myX= (int)x;     int myY= (int)y;  return (object) (myX + myY);}.
К такому методу можно обращаться как обычным способом
C#
1
Int  z = (int)   Summa(10, 20);
так и потокобезопасно

C#
1
Int z=  (int )  CoreParallel. units[myUnit]. unitRunMetod. Synchronous (Summa   ,  10,  20);
Подобным образом не следует обращаться к методам ,в теле которых не производится приведение типов аргументов, например, к методам расположенных в сторонней библиотеке.
Пусть метод Summa расположен в месте, предоставляющем точку входа , допустим, в сторонней библиотеке. Потокобезопасный вызов метода должен осуществляться через потокобезопасный вызов оболочки этого метода.
C#
1
2
3
4
5
6
object    MySumma(object x, object y)
  {   int myX= (int)x;     int myY= (int)y;
      return (object) Summa(int myX, myY   );
   }
//Вызываем оболочку
Int z=  (int )  CoreParallel. units[myUnit]. unitRunMetod. Synchronous (MySumma   ,  10,  20);.
Сторонний метод будет исполнен потокобезопасно.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.11.2015, 10:43
C#
1
2
3
4
5
6
7
public object Synchronous( 
Func<object,object,object,object,object   ,object   ,object  ,object, object  , object , object  , object, object  , object, object, object, object>   func,
 
object argument1,     object argument2,     object argument3,     object argument4   ,
object argument5,     object argument6 ,    object argument7,     object argument8  ,
object argument9,     object argument10 ,  object argument11 ,  object argument12 ,
object argument13 ,  object argument14 ,  object argument15 ,  object argument16)
0
-39 / 2 / 1
Регистрация: 21.09.2015
Сообщений: 58
09.11.2015, 11:13  [ТС]
Максимум 16 входных аргументов. При вызове забудьте о прототипе, просто перечисляйте аргументы. Единственное ограничение – метод всегда возвращает тип object, к конкретному типу надо приводить самостоятельно.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// метод  с  2 аргументами
Int z=  (int )  CoreParallel. units[myUnit]. unitRunMetod. Synchronous (Summa2   ,  10,  20);
 
// метод с 3 аргументами
Int z=  (int )  CoreParallel. units[myUnit]. unitRunMetod. Synchronous (Summa3   ,  10,  20, 30);
//  …..
 
// метод с 16 аргументами
Int z=  (int )  CoreParallel. units[myUnit]. unitRunMetod. Synchronous 
    (Summa16   ,  10,  20, 30,40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160);
// метод без аргументов и возвращаемого значения
CoreParallel. units[myUnit]. unitRunMetod. Synchronous (OneArgumentMetod);
 
// метод без аргументов  с возвращаемым значением
Int z=  (int )  CoreParallel. units[myUnit]. unitRunMetod. Synchronous (Summa0)
0
0 / 0 / 0
Регистрация: 08.10.2015
Сообщений: 5
25.11.2015, 09:50
В WPF присутствует возможность связывания данных. У вас замечательная система визуализации данных. А если потребуется, чтобы одно изменение в данных вызвало каскад изменений. Можно ли такое сделать в этой разработке?
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
27.11.2015, 10:17
ну я тут темку почитал и мне кажется что это "достойный" наследник библиотеки FVMAS
Dedoc, вы случаем с разработчиком FVMAS, Кольчуриным Юрием Сергеевичем, не консультировались? а то подход к написанию кода ну уж очень то похож эхх где мои 28 лет и почти 1300 страниц оффтопа по сабжу :-D на sql.ru я там знатно проржался в свое время, уж сколько там тролей выросло.... не перечесть
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
27.11.2015, 10:19
агерон, ахаха, про уникальные алгоритмы порадовало 100% человек шарит в криптографии, раз изобретает свои собственные алгоритмы
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
27.11.2015, 10:29
Psilon, в гугле про FVMAS поищи, почитай, проржешься, жаль конечно что основную ветку по теме на sql.ru прибили но и эта ветка тоже достовляет
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
27.11.2015, 10:32
агерон, ой, спасибо. Читать очередного душевнобольного нет желания В своё время и так наслушался аудиозаписей разговоров людей с шизофренией. Нечто подобное и тут.
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
27.11.2015, 10:38
ну это да... такой бред не каждый прочитать до конца может :-D
0
-39 / 2 / 1
Регистрация: 21.09.2015
Сообщений: 58
27.11.2015, 13:05  [ТС]
Цитата Сообщение от агерон Посмотреть сообщение
ну я тут темку почитал и мне кажется что это "достойный" наследник библиотеки FVMAS

Эта библиотека – комплекс классов для безопасного многопоточного программирования. На ее основе можно разрабатывать базы данных, классы позволяют реализовывать потокобезопасный доступ к источнику данных, но прямой реализации базы банных в библиотеке нет. Возможно со временем добавлю встроенную реализацию сетевой (не реляционной) базы данных.
0
27.11.2015, 16:51

Не по теме:


хм, и правда похож. Может это и есть тот самый Дедал?

0
 Аватар для sau
2875 / 2080 / 386
Регистрация: 22.07.2011
Сообщений: 7,837
27.11.2015, 18:32
Одним словом - очередная велосипедная хрень , по сути и так все просто до невозможного в TPL.
П.С На архитектуру данной библиотеки вообще страшно смотреть.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.11.2015, 18:32

Нужен совет по архитектуре многопоточного приложения
Здравствуйте. Есть приложение WPF MVVM, которое обрабатывает файлы. Так как обработка файлов занимает время, то хотелось бы информировать...

Паттерны многопоточного программирования
Добрый день. Есть ли какие либо шаблоны. Есть желание с темой познакомиться хорошо. Пока хочу создание потоков и работу с ними...

Умножение матриц с использоанием многопоточного программирования
Нужно переделать однопоточное в многопоточное :( using System; using System.Collections.Generic; using System.Linq; using...

Время многопоточного выполнения функции
Этот код исполняется за 0.4 сек на моём компьюетере private void Foo() { for (int i = 0; i &lt; 100000000;...

Разработка многопоточного приложения для обучения
какую бы многопоточную программу написать новичку чтоб опыта набратся есть предложения?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru