Blazor как лучше организовать работу с async/await?
Не так давно начал проект на blazor. В целом положительные впечатления, но столкнулся с принципиальным вопросом, который может сильно осложнить ситуацию. Может кто уже проходил это и подскажет удобный вариант решения.
Сама организация проекта подталкивает меня использовать async/await в коде. При работе с JS кодом вообще нет альтернатив этому (InvokeAsync). Поэтому весь код начиная от onClick и до DisposeAsync асинхронный. При этом опытным путем выяснил, что async OnClick для кнопки, к примеру, выполняется без ожидания.
Таким образом, прихожу к пониманию, что вместо ожидаемого условного однопоточного программирования интерфейса, я получаю многопоточное программирование, что тянет за собой все прелести типа симафоров и т.п.
Использовать Lock при этом практически невозможно (нельзя await внутри него).
Итого, я столкнулся с ситуацией, когда я либо нахожу решение, которое позволить синхронно выполнять код, связанный с интерфейсом и продолжить писать код в сложившемся уже для меня стиле, либо переписывать имеющийся код и писать новый в условиях многопоточности.
Прошу помощи, если вы уже сталкивались с этим. Какой пути выбрали? Какие решения применили?
Так async await как раз и позволяет выполнить что-то асинхронно (не факт, что в другом потоке), при этом продолжить работу в UI потоке, после await, если и до await был UI поток. async await и помогает писать асинхронный код в синхронном стиле. Вот если бы ты заюзал Reactive Extensions, то это был бы другой стиль.
Лучше пример приведи какой-нибудь, а то проблема не понятна, которая у тебя возникает, если она вообще есть.
public async Task Test()
{
for (int i = 0; i < 500; i++)
{
MapPolygon polygon = new MapPolygon();
polygon.Geometry = new MapMapLatLngCollection() {
new MapLatLng(){
Lat = i * 0.1,
Lng = i * 0.1
},
new MapLatLng(){
Lat = i * 0.1 + 1,
Lng = i * 0.1
},
new MapLatLng(){
Lat = i * 0.1 + 1,
Lng = i * 0.1 + 1
},
new MapLatLng(){
Lat = i * 0.1,
Lng = i * 0.1 + 1
},
};
await polygon.AddToMap(map); //тут вызов JS
}
}
Код рисует на карте 500 прямоугольников. Причем рисует 5-10 сек.
от асинхронности избавиться никак нельзя (не нашел вариантов).
В процессе можно закрыть диалог с картой (перейти на другую страницу) или еще раз нажать кнопку test.
Пофиксить ситуацию найду как, изменив код на многопоточную парадигму, но тогда надо переделать весь проект под многопоточность, а в UI очень не хочется этого делать.