Live data from Hacker News

Asynchronous Programming in C#

github.com

141–150 of 186 posts

Re: Asynchronous Programming in C#

#141

I use C# primarily for Unity, and the part about avoiding async void caught me off guard. So, I tested it out and found that in Unity, throwing an exception from an async void method doesn't crash the process. So, it seems that the advice about avoiding async void is specific to ASP.NET.

I can confirm this. Unity handles this differently. But this is also true of Exceptions in Unity in general.

Re: Asynchronous Programming in C#

#142
post #57
post #14

C# was my first exposure to async/await back in 2015 and I initially had trouble wrapping my head around various details (i.e. ConfigureAwait etc.). I think the languages that have done best job in removing all that detail are Go and Elixir (Beam based languages). Which if you pay attention removed the overhead of rewiring your brain to do async/await all the way down. I repeated async/await systems recently with Kot…

It's kind of odd that JetBrains chose async/await for Kotlin considering the JVM is going towards the Go approach for virtual threads. I guess they had to since they wanted to support android/js?

It makes sense for UI patterns and any pattern where you need to bind to a specific OS thread.

Re: Asynchronous Programming in C#

#143

So much content and the `ConfigureAwait` portion, which is the BIGGEST gotcha in the whole shebang in my opinion, is not filled out?! Especially for Xamarin, you need to understand and use ConfigureAwait to properly bounce between UI / background threads.

What do you mean by this? I consider ConfigureAwait to be more of an optimization -- if I want to run something on a UI thread, I'm explicit about it.

Re: Asynchronous Programming in C#

#144

Is there a rule as to which methods are best made async and which not? Or, once you start using async would it be best to make ALL methods async? Many methods could be either sync or async. But if you make a method that doesn't strictly need to be async async you give yourself the option of later making it actually return its result after a delay, say reading its answer from the web or asynchronously from disk. Where…

The rule: If you need to call an async method, then you make your method also async. As such, your callers will then also need to be async.

Visual studio will actually give you a little warning if you make a method async and then don't await on any async methods.

Re: Asynchronous Programming in C#

#145

Is there a rule as to which methods are best made async and which not? Or, once you start using async would it be best to make ALL methods async? Many methods could be either sync or async. But if you make a method that doesn't strictly need to be async async you give yourself the option of later making it actually return its result after a delay, say reading its answer from the web or asynchronously from disk. Where…

The would say that asynchronous methods are mostly about orchestration and side-effects and non-asynchronous ones about computations.

If your computation code reach out to fetch data or trigger side-effects I’d take that as a sign of it being badly factored. Try to push the async parts up the stack to an orchestration layer, and keep the computation code “pure”

Re: Asynchronous Programming in C#

#146
post #138

Been a few years now since I've worked much in C# but these all seem like things that should be linting rules. Can these be added as warnings to the compiler? Can you have custom lint/compiler warnings from the community like eslint?

yes

They are called “analyzers” in .net though

Re: Asynchronous Programming in C#

#147

Earlier quoted context omitted.

Concurrency does not require multi-threading. Maybe you mean parallelism? Concurrency can still be really valuable in the context of a single threaded application.

I did mean parallelism, but I think the point stands. There's very little practical use of async await outside of multithreading.

Syntax sugar aside. Wasn’t the simple scalability of single threaded async nodejs main selling point?

Re: Asynchronous Programming in C#

#148

Earlier quoted context omitted.

Strongly agree. Honestly, just the first point "Asynchrony is viral" is a huge fucking flag that this implementation sucks. It doesn't need to be viral, they just needed to make passing a continuation easy , and they failed miserably. Overall - I really like most of C#, but that async/await implementation is poor at best.

I thought about this for a while as well, especially as I'm both a Go and .NET programmer, and made the following observation: Go and .NET have something that's viral about their IO code. In Go's case it's errors, in .NET's case it's async. Then I realised that basically all code that is async in .NET is I/O code just like all code in Go that throws runtime errors is I/O code as well. This is not a perfect heuristic,…

> Go and .NET have something that's viral about their IO code.

This is basically what some language communities are trying to capture with “monads” (like “the IO monad”)

There are some work yet on how to make such representations compose[1] (like how IEnumerable + Task = IAsyncEnumerable) but eventually we’ll probably see some form of effect systems for all such things reach mainstream languages.

[1] http://okmij.org/ftp/Haskell/extensible/more.pdf

Re: Asynchronous Programming in C#

#149

Earlier quoted context omitted.

This is so true. .NET has been steadily going downhill for some time now. The best indicator is the absolutely rotten documentation for the more recent .NET stuff. Compare that to the older .NET Framework and/or Winapi documentation which was excellent.

Agreed about documentation. They produce a lot of it but it’s hard to use and doesn’t really give you the big picture. I know I am old but in the 90s and 2000s the MSDN documentation was fantastic. Sad to see it going downhill that much.

I agree the docs are getting half-baked, they lack context and guidance.

FWIW, github issues for all things .net have been a surprisingly good resource. Especially on the hot new things, microsoft folks are very responsive and helpful. I dare say it's better for many topics than stackoverflow.

Re: Asynchronous Programming in C#

#150
post #6

We use async/await pretty much universally throughout our codebase today. One thing to keep in mind is that this mode of programming is actually not the most performant way to handle many problems. It is simply the most expedient way to manage I/O and spread trivial things across many cores in large, complex codebases. You can typically retrofit an existing code pile to be async-capable without a whole lot of sufferi…

There's Task.Yield() which yields instantly. Task continuations happen on the same core by default, until you hit an IO completion or something else that knocks it onto the thread pool. This means that chaining lots of awaits together is very efficient, at least until you hit something that forces you to actually sleep.

In practice I tend to use a lot of homemade TaskCompletionSource, explicit threading and interlocked stuff where I need more control of continuation.

There's also a downside to explicit synchronization which you don't mention - if you design your threading for one load pattern, and your actual load is a different pattern, it crushes your application and it's difficult to refactor.

For instance, if you expect few users and many requests you might have a thread per user with a work queue for their requests. If you have many users with few requests then you have thousands of threads, which are actually context switches unlike Task yields.

I've heard that Midori was 50% faster than Windows, and it was nearly entirely written in something like C# with something like Tasks. The runtime was extremely different (no virtual memory, no threads) but it proves that the model can outperform traditional OS threading.

Post reply on HN