Await в конструкторе класса? Это возможно!
Ещё со времён GWBASIC и Turbo C++ всем программистам известно, что в код выполняется построчно, т.е. последовательно. Даже в Visual Basic .NET долгое время придерживались такой «идеологии». Но с появлением Windows 8, а точнее программ для Metro UI (точнее, новой виртуальной машины .Net, Windows Runtime), последовательное выполнение ушло в прошлое, поскольку оно не удовлетворяет требованиям к отзывчивому интерфейсу и многопоточности/оптимизации для многопроцессорных систем. Теперь код выполняется абы-как, каждая подпрограмма выполняется не дождавшись окончания предыдущей (переменные заполняются заполняются по мере готовности). Но бывают моменты, когда этот самый порядок «абы-как» не годен. В обычных подпрограммах типа Function и Sub предусмотрен префикс «x = Await имя_вызываемой_подпрограммы
«, но он требует объявления подпрограммы как «Private|Public Async Sub|Function Имя
«. Этим как-бы проблема решена. Где надо, вносится Await и всё работает как и прежде. Но в конструкторах классов (Public Sub New
) использование Await запрещено. Так как же быть? Выход прост — засандалить иммитатор последовательного выполнения принудительно.
Dim переменная = подпрограмма(параметры)
Do While переменная.AsTask.IsCompleted = False : Loop
В последствии, чтение переменных осуществляется переменная.Result
. Писать туда не запишешь, увы. Придётся завести ещё одну переменную (Dim имя As тип = переменная.Result
) и уже с ней производить всё, чего душа возжелает.
Недостатки: иногда случается исключение неверной операции:
Исключение типа «System.InvalidOperationException» возникло в System.Runtime.WindowsRuntime.dll, но не было обработано в коде пользователя
Дополнительные сведения: Представитель назначен, когда не разрешено. (Исключение из HRESULT: 0x80000018)
Это знаменитая защита WinRT от подвисания UI. Если такую свинью Windows Runtime всё-таки подкидывает, придётся выносить сие извращение в отдельный поток, но тогда уже пропадает смысл в данном «хаке».
Поделиться в соцсеть
Оставить комментарий