A user reported an issue with Stripe.net v46 where it would deadlock when executing a synchronous Get call on one of the services. After investigating, it looks like this call passes through several async calls that are missing ConfigureAsync(false) calls. ConfigureAsync(false) instructs the .NET task to not continue in the context captured when it is created; this is important because if that context is blocked (i.e. because we are synchronously waiting for a response), it will deadlock.
This problem was observed and subsequently reproduced on Windows using .NET Framework, and affects services created without using StripeClient (StripeClient accessed services work as expected).
What?
added ConfigureAwait(false) calls to all async/await methods that did not have them
enabled CA2007 warning (as an error) for src/Stripe.net which will alert to any async calls that do not call ConfigureAwait
Verified this fix by running the following in a ASP.NET Framework app, inside the Home page request handler, and confirming that Get does return and the program does proceed:
var svc = new LocationService();
svc.Get("tml_...", null, new Stripe.RequestOptions { ApiKey = "sk_test_..." });
Why?
A user reported an issue with Stripe.net v46 where it would deadlock when executing a synchronous Get call on one of the services. After investigating, it looks like this call passes through several async calls that are missing ConfigureAsync(false) calls. ConfigureAsync(false) instructs the .NET task to not continue in the context captured when it is created; this is important because if that context is blocked (i.e. because we are synchronously waiting for a response), it will deadlock.
This problem was observed and subsequently reproduced on Windows using .NET Framework, and affects services created without using
StripeClient
(StripeClient
accessed services work as expected).What?
ConfigureAwait(false)
calls to all async/await methods that did not have themVerified this fix by running the following in a ASP.NET Framework app, inside the Home page request handler, and confirming that Get does return and the program does proceed: