Персональный сайт Александра Тауениса » Await в конструкторе класса? Это возможно!

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 всё-таки подкидывает, придётся выносить сие извращение в отдельный поток, но тогда уже пропадает смысл в данном «хаке».



Оставить комментарий

Защита от спама * Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.