{"id":6923,"date":"2026-05-27T08:30:32","date_gmt":"2026-05-27T15:30:32","guid":{"rendered":"https:\/\/blackcap.name\/blog\/new\/?p=6923"},"modified":"2026-05-27T08:30:32","modified_gmt":"2026-05-27T15:30:32","slug":"avalonia-redux","status":"publish","type":"post","link":"https:\/\/blackcap.name\/blog\/new\/?p=6923","title":{"rendered":"Avalonia Redux"},"content":{"rendered":"<p>After using <a href=\"https:\/\/avaloniaui.net\/\">Avalonia<\/a> for one project, I can say that it is basically what I thought it was, with one exception.<\/p>\n<p>My previous deadline for the wxPython web site coming back up to something approaching full health blew by, so Avalonia it was. As I knew going in, it&#8217;s a little more clumsy and boilerplate-y than I like. The resulting apps don&#8217;t look as slick and polished as native ones (because they don&#8217;t use native widgets). But it works well enough, and it&#8217;s popular enough I don&#8217;t have big worries about it turning into abandonware.<\/p>\n<p>The exception was multithreading. Avalonia supports <a href=\"https:\/\/en.wikipedia.org\/wiki\/Async\/await\">async\/await<\/a>, or as Microsoft calls it <a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/standard\/asynchronous-programming-patterns\/task-based-asynchronous-pattern-tap\">task-based asynchronous programming<\/a>. Because of course it does. Async\/await got its start with .NET languages. So it&#8217;s been part of C# for a long time, and that feature has been fully absorbed into frameworks developed for that programming environment.<\/p>\n<p>This ends up making Avalonia a clear winner over Qt and its quirky signals and slots and its poorly-implemented memory management. It even makes it a clear winner over the callback-based multithreading that wxPython offers. Async\/await effectively compiles under the hood to callbacks, but it lets the programmer write code much more as if it were traditional blocking code, which makes coding far easier.<\/p>\n<p>Signals and slots were a significant step backwards over Swing\u2019s callbacks. Async\/await is a significant step forward. What seemed to be a narrow win now looks like a clear win. <\/p>\n<p>The things that make Avalonia suck still suck. All GUI frameworks suck. Avalonia simply sucks less than the alternatives for my purposes, significantly less.<\/p>\n<p>And yeah, I know: the <a href=\"https:\/\/wxpython.org\/\">wxPython web site<\/a> now seems to be back up. Well, so what? It took most of a fortnight to come back to full health. That speaks loudly as to how little momentum there currently is behind that platform.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>After using Avalonia for one project, I can say that it is basically what I thought it was, with one exception. My previous deadline for the wxPython web site coming back up to something approaching full health blew by, so Avalonia it was. As I knew going in, it&#8217;s a little more clumsy and boilerplate-y [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[],"class_list":["post-6923","post","type-post","status-publish","format-standard","hentry","category-computers"],"_links":{"self":[{"href":"https:\/\/blackcap.name\/blog\/new\/index.php?rest_route=\/wp\/v2\/posts\/6923","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blackcap.name\/blog\/new\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blackcap.name\/blog\/new\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blackcap.name\/blog\/new\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blackcap.name\/blog\/new\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6923"}],"version-history":[{"count":1,"href":"https:\/\/blackcap.name\/blog\/new\/index.php?rest_route=\/wp\/v2\/posts\/6923\/revisions"}],"predecessor-version":[{"id":6924,"href":"https:\/\/blackcap.name\/blog\/new\/index.php?rest_route=\/wp\/v2\/posts\/6923\/revisions\/6924"}],"wp:attachment":[{"href":"https:\/\/blackcap.name\/blog\/new\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6923"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blackcap.name\/blog\/new\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6923"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blackcap.name\/blog\/new\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6923"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}