dotnet/runtime

Analyzer for STAThread attribute applied to async Main

Open

#78,502 opened on Nov 17, 2022

View on GitHub
 (3 comments) (7 reactions) (0 assignees)C# (5,445 forks)batch import
api-approvedarea-System.Threading.Taskscode-analyzerhelp wanted

Repository metrics

Stars
 (17,886 stars)
PR merge metrics
 (Avg merge 12d 11h) (661 merged PRs in 30d)

Description

Describe the problem you are trying to solve

When the [STAThread] attribute is applied to an async Main method, it does not have the intended effect (the main thread of the application is not created with the single-threaded apartment state). Since this gotcha seems to be fairly common (see e.g. https://github.com/dotnet/roslyn/issues/22112 and the issues linked to it), users should be made aware of it.

Describe suggestions on how to achieve the rule

I'm not certain if a code fix is necessary, but it could remove [STAThread] from the async Main method and then do one of the following:

  1. Add Thread.CurrentThread.SetApartmentState(ApartmentState.STA); at the start of the async Main method.
  2. Rename the async Main method to MainAsync and then add [STAThread] static void Main() => MainAsync().GetAwaiter().GetResult();.

Contributor guide