Skip to content

Commit aa8a930

Browse files
committed
Merge remote-tracking branch 'upstream/develop' into feature/bgTasksCallStack
2 parents 01b44b5 + 9cf7ebe commit aa8a930

File tree

4 files changed

+70
-6
lines changed

4 files changed

+70
-6
lines changed

src/OneScript.StandardLibrary/Tasks/BackgroundTasksManager.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,13 @@ public BackgroundTask Execute(IRuntimeContextInstance target, string methodName,
4747
var task = new BackgroundTask(target, methodName, parameters);
4848
_tasks.Add(task);
4949

50+
var eventProcessor = MachineInstance.Current.EventProcessor;
51+
5052
var taskCreationOptions = longRunning ? TaskCreationOptions.LongRunning : TaskCreationOptions.None;
5153
var worker = new Task(() =>
5254
{
5355
MachineInstance.Current.SetMemory(_runtimeContext);
56+
MachineInstance.Current.EventProcessor = eventProcessor;
5457
var debugger = _runtimeContext.Services.TryResolve<IDebugController>();
5558
debugger?.AttachToThread();
5659
try

src/ScriptEngine.HostedScript/DefaultEventProcessor.cs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,15 @@ public void AddHandler(
7272
if (!_registeredHandlers.TryGetValue(eventSource, out var handlers))
7373
{
7474
handlers = new Dictionary<string, HandlersList>();
75-
handlers[eventName] = new HandlersList();
7675
_registeredHandlers[eventSource] = handlers;
7776
}
7877

79-
handlers[eventName].Add(handlerScript, handlerMethod);
78+
if (!handlers.TryGetValue(eventName, out var handlersList)) {
79+
handlersList = new HandlersList();
80+
handlers[eventName] = handlersList;
81+
}
82+
83+
handlersList.Add(handlerScript, handlerMethod);
8084
}
8185

8286
public void RemoveHandler(
@@ -88,9 +92,13 @@ public void RemoveHandler(
8892
if (!(handlerTarget is ScriptDrivenObject handlerScript))
8993
throw RuntimeException.InvalidArgumentType("handlerTarget");
9094

91-
if (_registeredHandlers.TryGetValue(eventSource, out var handlers))
95+
if (!_registeredHandlers.TryGetValue(eventSource, out var handlers))
9296
{
93-
handlers[eventName].Remove(handlerScript, handlerMethod);
97+
return;
98+
}
99+
100+
if (handlers.TryGetValue(eventName, out var handlersList)) {
101+
handlersList.Remove(handlerScript, handlerMethod);
94102
}
95103
}
96104

@@ -99,7 +107,11 @@ public void HandleEvent(IRuntimeContextInstance eventSource, string eventName, I
99107
if (!_registeredHandlers.TryGetValue(eventSource, out var handlers))
100108
return;
101109

102-
foreach (var handler in handlers[eventName])
110+
if (!handlers.TryGetValue(eventName, out var handlersList)) {
111+
return;
112+
}
113+
114+
foreach (var handler in handlersList)
103115
{
104116
handler.Method(eventArgs);
105117
}

tests/events.os

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоПодпискаПоОбъектуВидитТолькоЭкспорт");
1717
ВсеТесты.Добавить("ТестДолжен_ПроверитьПодпискуНаСобытиеВВидеВыражения");
1818
ВсеТесты.Добавить("ТестДолжен_ПроверитьПодпискуСОбработчикомВВидеВыражения");
19+
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоУИсточникаМожетБытьНесколькоСобытий");
1920

2021
Возврат ВсеТесты;
2122

@@ -175,4 +176,23 @@
175176

176177
КонецПроцедуры
177178

179+
Процедура ТестДолжен_ПроверитьЧтоУИсточникаМожетБытьНесколькоСобытий() Экспорт
180+
181+
Источник = Новый ТестСобытий;
182+
183+
ДобавитьОбработчик Источник.МоеСобытие, ОбработчикСобытияВнутр;
184+
ДобавитьОбработчик Источник.МоеСобытиеВторое, ОбработчикСобытияВнутр;
185+
186+
МассивПараметров = Новый Массив;
187+
МассивПараметров.Добавить("П1");
188+
МассивПараметров.Добавить("П2");
189+
190+
Источник.СгенерироватьСобытие("МоеСобытие", МассивПараметров);
191+
юТест.ПроверитьРавенство(1, СчетчикВызовов);
192+
193+
Источник.СгенерироватьСобытие("МоеСобытиеВторое", МассивПараметров);
194+
юТест.ПроверитьРавенство(2, СчетчикВызовов);
195+
196+
КонецПроцедуры
197+
178198
ПодключитьСценарий(ТекущийСценарий().Источник, "ТестСобытий");

tests/tasks.os

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
Перем глБлокировка;
44
Перем глСумма;
55

6+
Перем СобытиеВызвано;
7+
68
////////////////////////////////////////////////////////////////////
79
// Программный интерфейс
810

@@ -23,6 +25,7 @@
2325
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоРаботаетБлокировка");
2426
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоКодМожетОпределитьИДЗадания");
2527
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоВИнформацииОбОшибкеЕстьСтекВызовов");
28+
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоОбработчикиСобытийВызываютсяВФоновомЗадании");
2629

2730
Возврат ВсеТесты;
2831

@@ -69,8 +72,12 @@
6972

7073
КонецПроцедуры
7174

75+
Процедура Событие() Экспорт
76+
СобытиеВызвано = Истина;
77+
КонецПроцедуры
78+
7279
Процедура ТестДолжен_ПроверитьСозданиеЗаданий() Экспорт
73-
80+
7481
Задание = ФоновыеЗадания.Выполнить(ЭтотОбъект, "ПроцедураБезПараметров");
7582
юТест.ПроверитьИстину(ЗначениеЗаполнено(Задание.УникальныйИдентификатор));
7683
юТест.ПроверитьРавенство("ПроцедураБезПараметров", Задание.ИмяМетода);
@@ -281,3 +288,25 @@
281288
юТест.ПроверитьРавенство(СтекВызовов[0].ИмяМодуля, ТекущийСценарий().Источник);
282289

283290
КонецПроцедуры
291+
292+
Процедура ТестДолжен_ПроверитьЧтоОбработчикиСобытийВызываютсяВФоновомЗадании() Экспорт
293+
294+
СобытиеВызвано = Ложь;
295+
296+
Параметры = Новый Массив;
297+
Параметры.Добавить("ЯСобытие");
298+
Параметры.Добавить(Новый Массив);
299+
300+
ДобавитьОбработчик ЭтотОбъект.ЯСобытие, Событие;
301+
302+
ФоновоеЗадание = ФоновыеЗадания.Выполнить(ЭтотОбъект, "ВызватьСобытие", Параметры);
303+
ФоновоеЗадание.ОжидатьЗавершения();
304+
305+
УдалитьОбработчик ЭтотОбъект.ЯСобытие, Событие;
306+
307+
юТест.ПроверитьИстину(
308+
СобытиеВызвано,
309+
"Ожидали что при вызове события в фоновом задании вызовется, а это не так"
310+
);
311+
312+
КонецПроцедуры

0 commit comments

Comments
 (0)