Skip to content
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

Refactor Connected Service tests that are Synchronous to Match their execution Context. #412

Closed
marabooy opened this issue Aug 27, 2024 · 0 comments · Fixed by #413
Closed
Labels
Feature New feature

Comments

@marabooy
Copy link
Member

marabooy commented Aug 27, 2024

Is your feature request related to a problem? Please describe.

Currently, most of the Connected Service tests utilize Task.Wait() to ensure that the context does not shift from the Main UI thread while executing certain end-to-end (E2E) code and expectations. However, this approach does not align well with how Visual Studio executes tasks, potentially obscuring issues when transitioning code to an asynchronous model.

For example, SetFileAsEmbeddedResource in ConnectedServiceFileHandler.cs should only execute on the main thread. If it does not, a silent exception is thrown and handled by Visual Studio.

Similarly, the AddFileAsync method in the same file also throws a silent exception when called. These silent exceptions could contribute to slowdowns in Visual Studio.

Describe the solution you'd like

Refactoring the tests to use STAThread could assist in refactoring core components and enable the use of ThreadHelper, preventing extra exceptions when code like AddFileAsync interacts with COM extensions in Visual Studio.

Describe alternatives you've considered

N/A

Additional context

Implementing this solution would also significantly reduce the number of warnings in the Connected Service project and facilitate the migration of other code branches to use asynchronous patterns.

Sample Warnings

"D:\a\1\s\ODataCodeGenTools.sln" (default target) (1) ->
"D:\a\1\s\test\ODataConnectedService.Tests\ODataConnectedService.Tests.csproj" (default target) (5) ->
"D:\a\1\s\src\ODataConnectedService_VS2022Plus\ODataConnectedService_VS2022Plus.csproj" (default target) (6:2) ->
  D:\a\1\s\src\ODataConnectedService.Shared\ConnectedServicePackageInstaller.cs(29,16): warning CS0618: 'IVsPackageInstallerServices' is obsolete: 'Use INuGetProjectService in the NuGet.VisualStudio.Contracts package instead.' [D:\a\1\s\src\ODataConnectedService_VS2022Plus\ODataConnectedService_VS2022Plus.csproj]
  D:\a\1\s\src\ODataConnectedService.Shared\ConnectedServicePackageInstaller.cs(53,75): warning CS0618: 'IVsPackageInstallerServices' is obsolete: 'Use INuGetProjectService in the NuGet.VisualStudio.Contracts package instead.' [D:\a\1\s\src\ODataConnectedService_VS2022Plus\ODataConnectedService_VS2022Plus.csproj]
  D:\a\1\s\src\ODataConnectedService.Shared\ConnectedServicePackageInstaller.cs(69,26): warning CS0618: 'IVsPackageInstallerServices.IsPackageInstalled(Project, string)' is obsolete: 'This method can cause UI delays if called on the UI thread. Use INuGetProjectService.GetInstalledPackagesAsync in the NuGet.VisualStudio.Contracts package instead, and check the specific package you're interested in' [D:\a\1\s\src\ODataConnectedService_VS2022Plus\ODataConnectedService_VS2022Plus.csproj]
  D:\a\1\s\src\ODataConnectedService.Shared\ConnectedServicePackageInstaller.cs(72,25): warning CS0618: 'IVsPackageInstaller.InstallPackage(string, Project, string, Version, bool)' is obsolete: 'System.Version does not support SemVer pre-release versions. Use the overload with string version instead.' [D:\a\1\s\src\ODataConnectedService_VS2022Plus\ODataConnectedService_VS2022Plus.csproj]
  D:\a\1\s\src\ODataConnectedService.Shared\Common\UserSettingsPersistenceHelper.cs(137,113): warning VSTHRD002: Synchronously waiting on tasks or awaiters may cause deadlocks. Use await or JoinableTaskFactory.Run instead. (https://github.com/Microsoft/vs-threading/blob/main/doc/analyzers/VSTHRD002.md) [D:\a\1\s\src\ODataConnectedService_VS2022Plus\ODataConnectedService_VS2022Plus.csproj]
  D:\a\1\s\src\ODataConnectedService.Shared\Common\ProjectHelper.cs(28,43): warning VSTHRD010: Accessing "IVsHierarchy" should only be done on the main thread. Call Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread() first. (https://github.com/Microsoft/vs-threading/blob/main/doc/analyzers/VSTHRD010.md) [D:\a\1\s\src\ODataConnectedService_VS2022Plus\ODataConnectedService_VS2022Plus.csproj]
  D:\a\1\s\src\ODataConnectedService.Shared\Common\ProjectHelper.cs(37,20): warning VSTHRD010: Accessing "Project" should only be done on the main thread. Call Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread() first. (https://github.com/Microsoft/vs-threading/blob/main/doc/analyzers/VSTHRD010.md) [D:\a\1\s\src\ODataConnectedService_VS2022Plus\ODataConnectedService_VS2022Plus.csproj]
  D:\a\1\s\src\ODataConnectedService.Shared\Common\ProjectHelper.cs(42,56): warning VSTHRD010: Accessing "Property" should only be done on the main thread. Call Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread() first. (https://github.com/Microsoft/vs-threading/blob/main/doc/analyzers/VSTHRD010.md) [D:\a\1\s\src\ODataConnectedService_VS2022Plus\ODataConnectedService_VS2022Plus.csproj]
  D:\a\1\s\src\ODataConnectedService.Shared\Common\ProjectHelper.cs(42,39): warning VSTHRD010: Accessing "Properties" should only be done on the main thread. Call Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread() first. (https://github.com/Microsoft/vs-threading/blob/main/doc/analyzers/VSTHRD010.md) [D:\a\1\s\src\ODataConnectedService_VS2022Plus\ODataConnectedService_VS2022Plus.csproj]
  D:\a\1\s\src\ODataConnectedService.Shared\Common\ProjectHelper.cs(47,39): warning VSTHRD010: Accessing "CodeModel" should only be done on the main thread. Call Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread() first. (https://github.com/Microsoft/vs-threading/blob/main/doc/analyzers/VSTHRD010.md) [D:\a\1\s\src\ODataConnectedService_VS2022Plus\ODataConnectedService_VS2022Plus.csproj]
  D:\a\1\s\src\ODataConnectedService.Shared\Common\ProjectHelper.cs(47,29): warning VSTHRD010: Accessing "Project" should only be done on the main thread. Call Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread() first. (https://github.com/Microsoft/vs-threading/blob/main/doc/analyzers/VSTHRD010.md) [D:\a\1\s\src\ODataConnectedService_VS2022Plus\ODataConnectedService_VS2022Plus.csproj]
  D:\a\1\s\src\ODataConnectedService.Shared\Common\ProjectHelper.cs(42,28): warning VSTHRD010: Accessing "Project" should only be done on the main thread. Call Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread() first. (https://github.com/Microsoft/vs-threading/blob/main/doc/analyzers/VSTHRD010.md) [D:\a\1\s\src\ODataConnectedService_VS2022Plus\ODataConnectedService_VS2022Plus.csproj]
  D:\a\1\s\src\ODataConnectedService.Shared\Views\ConfigODataEndpoint.xaml.cs(61,28): warning VSTHRD100: Avoid "async void" methods, because any exceptions not handled by the method will crash the process (https://github.com/Microsoft/vs-threading/blob/main/doc/analyzers/VSTHRD100.md) [D:\a\1\s\src\ODataConnectedService_VS2022Plus\ODataConnectedService_VS2022Plus.csproj]
  D:\a\1\s\src\ODataConnectedService.Shared\ConnectedServiceFileHandler.cs(64,90): warning VSTHRD010: Accessing "DTE" should only be done on the main thread. Call Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread() first. (https://github.com/Microsoft/vs-threading/blob/main/doc/analyzers/VSTHRD010.md) [D:\a\1\s\src\ODataConnectedService_VS2022Plus\ODataConnectedService_VS2022Plus.csproj]
  D:\a\1\s\src\ODataConnectedService.Shared\ConnectedServiceFileHandler.cs(67,208): warning VSTHRD010: Accessing "ProjectItems" should only be done on the main thread. Call Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread() first. (https://github.com/Microsoft/vs-threading/blob/main/doc/analyzers/VSTHRD010.md) [D:\a\1\s\src\ODataConnectedService_VS2022Plus\ODataConnectedService_VS2022Plus.csproj]
  D:\a\1\s\src\ODataConnectedService.Shared\ConnectedServiceFileHandler.cs(67,195): warning VSTHRD010: Accessing "ProjectItem" should only be done on the main thread. Call Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread() first. (https://github.com/Microsoft/vs-threading/blob/main/doc/analyzers/VSTHRD010.md) [D:\a\1\s\src\ODataConnectedService_VS2022Plus\ODataConnectedService_VS2022Plus.csproj]
  D:\a\1\s\src\ODataConnectedService.Shared\ConnectedServiceFileHandler.cs(67,101): warning VSTHRD010: Accessing "ProjectItems" should only be done on the main thread. Call Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread() first. (https://github.com/Microsoft/vs-threading/blob/main/doc/analyzers/VSTHRD010.md) [D:\a\1\s\src\ODataConnectedService_VS2022Plus\ODataConnectedService_VS2022Plus.csproj]
  D:\a\1\s\src\ODataConnectedService.Shared\ConnectedServiceFileHandler.cs(67,88): warning VSTHRD010: Accessing "ProjectItem" should only be done on the main thread. Call Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread() first. (https://github.com/Microsoft/vs-threading/blob/main/doc/analyzers/VSTHRD010.md) [D:\a\1\s\src\ODataConnectedService_VS2022Plus\ODataConnectedService_VS2022Plus.csproj]
  D:\a\1\s\src\ODataConnectedService.Shared\ConnectedServiceFileHandler.cs(67,61): warning VSTHRD010: Accessing "ProjectItems" should only be done on the main thread. Call Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread() first. (https://github.com/Microsoft/vs-threading/blob/main/doc/analyzers/VSTHRD010.md) [D:\a\1\s\src\ODataConnectedService_VS2022Plus\ODataConnectedService_VS2022Plus.csproj]
  D:\a\1\s\src\ODataConnectedService.Shared\ConnectedServiceFileHandler.cs(67,48): warning VSTHRD010: Accessing "Project" should only be done on the main thread. Call Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread() first. (https://github.com/Microsoft/vs-threading/blob/main/doc/analyzers/VSTHRD010.md) [D:\a\1\s\src\ODataConnectedService_VS2022Plus\ODataConnectedService_VS2022Plus.csproj]
  D:\a\1\s\src\ODataConnectedService.Shared\ConnectedServiceFileHandler.cs(68,60): warning VSTHRD010: Accessing "Property" should only be done on the main thread. Call Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread() first. (https://github.com/Microsoft/vs-threading/blob/main/doc/analyzers/VSTHRD010.md) [D:\a\1\s\src\ODataConnectedService_VS2022Plus\ODataConnectedService_VS2022Plus.csproj]
  D:\a\1\s\src\ODataConnectedService.Shared\ConnectedServiceFileHandler.cs(68,40): warning VSTHRD010: Accessing "Properties" should only be done on the main thread. Call Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread() first. (https://github.com/Microsoft/vs-threading/blob/main/doc/analyzers/VSTHRD010.md) [D:\a\1\s\src\ODataConnectedService_VS2022Plus\ODataConnectedService_VS2022Plus.csproj]
  D:\a\1\s\src\ODataConnectedService.Shared\ConnectedServiceFileHandler.cs(68,29): warning VSTHRD010: Accessing "ProjectItem" should only be done on the main thread. Call Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread() first. (https://github.com/Microsoft/vs-threading/blob/main/doc/analyzers/VSTHRD010.md) [D:\a\1\s\src\ODataConnectedService_VS2022Plus\ODataConnectedService_VS2022Plus.csproj]

@marabooy marabooy added the Feature New feature label Aug 27, 2024
@marabooy marabooy changed the title Refactor Connected Service test that are Synchronous to Match their execution Context. Refactor Connected Service tests that are Synchronous to Match their execution Context. Aug 27, 2024
@OData OData deleted a comment from YeGop0218 Aug 27, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Feature New feature
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants
@marabooy and others