-
Notifications
You must be signed in to change notification settings - Fork 28
chore: add ConfigureAwait + warning #652
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
Adds ConfigureAwait(false) to all await calls and adds a library that generates a warning for any missing ConfigureAwait calls. See https://devblogs.microsoft.com/dotnet/configureawait-faq/#when-should-i-use-configureawait(false)
Summary of ChangesHello @olavloite, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request significantly enhances the robustness and efficiency of asynchronous operations within the Spanner .NET library. By systematically applying Highlights
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
This is a great improvement for the library's async API. Adding ConfigureAwait(false) is essential for preventing deadlocks in various application models, and the inclusion of the ConfigureAwaitChecker.Analyzer is a solid step to maintain this practice going forward. I've left one suggestion for improving consistency in some async methods that were not covered by the analyzer but would still benefit from this change.
| public async Task<ResultSetMetadata?> MetadataAsync(Rows rows, CancellationToken cancellationToken = default) | ||
| { | ||
| return await Task.Run(() => Metadata(rows), cancellationToken); | ||
| return await Task.Run(() => Metadata(rows), cancellationToken).ConfigureAwait(false); | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This change to use ConfigureAwait(false) is correct and follows best practices for library code.
For consistency and to fully prevent synchronization context capturing, consider applying a similar async/await pattern to other asynchronous methods in this class that currently return Task.Run(...) directly. These methods are not flagged by ConfigureAwaitChecker.Analyzer because they don't use the await keyword, but they will still capture the synchronization context when awaited by a caller.
For example, WriteMutationsAsync could be changed to:
public async Task<CommitResponse?> WriteMutationsAsync(Connection connection,
BatchWriteRequest.Types.MutationGroup mutations, CancellationToken cancellationToken = default)
{
return await Task.Run(() => WriteMutations(connection, mutations), cancellationToken).ConfigureAwait(false);
}This pattern should be applied to the following methods as well:
ExecuteAsyncExecuteBatchAsyncCloseRowsAsyncCommitAsyncRollbackAsync
Adds ConfigureAwait(false) to all await calls and adds a library that generates a warning for any missing ConfigureAwait calls.
See https://devblogs.microsoft.com/dotnet/configureawait-faq/#when-should-i-use-configureawait(false)