Title: Thread safe class method defined in Powershell hangs inside a Lazy inside a ConcurrentDictionary · Issue #18248 · PowerShell/PowerShell · GitHub
Open Graph Title: Thread safe class method defined in Powershell hangs inside a Lazy inside a ConcurrentDictionary · Issue #18248 · PowerShell/PowerShell
X Title: Thread safe class method defined in Powershell hangs inside a Lazy inside a ConcurrentDictionary · Issue #18248 · PowerShell/PowerShell
Description: Prerequisites Write a descriptive title. Make sure you are able to repro it on the latest released version Search the existing issues. Refer to the FAQ. Refer to Differences between Windows PowerShell 5.1 and PowerShell. Steps to reprodu...
Open Graph Description: Prerequisites Write a descriptive title. Make sure you are able to repro it on the latest released version Search the existing issues. Refer to the FAQ. Refer to Differences between Windows PowerSh...
X Description: Prerequisites Write a descriptive title. Make sure you are able to repro it on the latest released version Search the existing issues. Refer to the FAQ. Refer to Differences between Windows PowerSh...
Opengraph URL: https://github.com/PowerShell/PowerShell/issues/18248
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Thread safe class method defined in Powershell hangs inside a Lazy inside a ConcurrentDictionary","articleBody":"### Prerequisites\r\n\r\n- [X] Write a descriptive title.\r\n- [X] Make sure you are able to repro it on the [latest released version](https://github.com/PowerShell/PowerShell/releases)\r\n- [X] Search the existing issues.\r\n- [X] Refer to the [FAQ](https://github.com/PowerShell/PowerShell/blob/master/docs/FAQ.md).\r\n- [X] Refer to [Differences between Windows PowerShell 5.1 and PowerShell](https://docs.microsoft.com/powershell/scripting/whats-new/differences-from-windows-powershell).\r\n\r\n### Steps to reproduce\r\n\r\nI have a thread safe class method (it's static and empty) that is hanging when called inside of a ```System.Lazy``` initializer inside of a ```System.Collections.Concurrent.ConcurrentDictionary``` when used with ```ForEach-Object -Parallel```. Calling a normal dotnet method works fine (e.g. ```[System.Convert]::ToString(132456, 2)```), but my ```[Dead]::Lock()``` method call hangs.\r\n\r\nThis is as far as I was able to strip my repro code down while still causing the hang:\r\n````Powershell\r\n#Requires -Version 7\r\n\r\nWrite-Host \"Starting job`n\"\r\n\r\n$dict = [System.Collections.Concurrent.ConcurrentDictionary[string, System.Lazy[string]]]::new()\r\n\r\n$job = 1..16 | ForEach-Object -AsJob -ThrottleLimit 16 -Parallel {\r\n $threadNum = $_\r\n $dict = $using:dict\r\n\r\n class Dead {\r\n # This method should be thread safe(?)\r\n static [void] Lock() {\r\n }\r\n }\r\n\r\n [System.Console]::WriteLine(\"Starting thread #$threadNum\")\r\n\r\n $lazy = $dict.GetOrAdd(\"same key\", [System.Lazy[string]]::new(\r\n {\r\n # Calling this method causes the script to hang, even though it should(?) be thread safe\r\n [Dead]::Lock()\r\n\r\n $okToCall = [System.Convert]::ToString(132456, 2)\r\n return \"\"\r\n },\r\n [System.Threading.LazyThreadSafetyMode]::ExecutionAndPublication))\r\n\r\n [void]$lazy.Value\r\n\r\n [System.Console]::WriteLine(\"Completed thread #$threadNum\")\r\n}\r\ntry {\r\n while (!$job.Finished.WaitOne(1000)) {\r\n Write-Host \"$(Get-Date): Waiting\"\r\n }\r\n $job | Receive-Job\r\n\r\n Write-Host \"`nFinished job`n\"\r\n} finally {\r\n $job | Stop-Job\r\n}\r\n````\r\n\r\nNote: you may need to run this a bunch of times to actually see the hang. I'm also running this without my profile to ensure that's not interfering: ```pwsh.exe -NoProfile -File $Home\\OneDrive\\Scripts\\bug.ps1```\r\n\r\nI've had independent verification of the hang from at least one other user.\r\n\r\n### Expected behavior\r\n\r\n```console\r\nPS C:\\\u003e pwsh.exe -NoProfile -File $Home\\OneDrive\\Scripts\\bug.ps1\r\nStarting job\r\n\r\nStarting thread #1\r\nStarting thread #2\r\nStarting thread #3\r\nStarting thread #4\r\nStarting thread #5\r\nStarting thread #6\r\nStarting thread #7\r\nStarting thread #8\r\nStarting thread #9\r\nStarting thread #10\r\nStarting thread #11\r\nStarting thread #12\r\nStarting thread #13\r\nStarting thread #14\r\nStarting thread #15\r\nStarting thread #16\r\nCompleted thread #2\r\nCompleted thread #6\r\nCompleted thread #9\r\nCompleted thread #13\r\nCompleted thread #3\r\nCompleted thread #1\r\nCompleted thread #4\r\nCompleted thread #5\r\nCompleted thread #7\r\nCompleted thread #8\r\nCompleted thread #10\r\nCompleted thread #11\r\nCompleted thread #12\r\nCompleted thread #14\r\nCompleted thread #15\r\nCompleted thread #16\r\n\r\nFinished job\r\n\r\nPS C:\\\u003e\r\n```\r\n\r\n\r\n### Actual behavior\r\n\r\n```console\r\nPS C:\\\u003e pwsh.exe -NoProfile -File $Home\\OneDrive\\Scripts\\bug.ps1\r\nStarting job\r\n\r\nStarting thread #2\r\nStarting thread #1\r\nStarting thread #3\r\nStarting thread #4\r\nStarting thread #5\r\nStarting thread #6\r\nStarting thread #7\r\nStarting thread #8\r\nStarting thread #9\r\nStarting thread #10\r\nStarting thread #11\r\nStarting thread #12\r\nStarting thread #13\r\nStarting thread #14\r\nStarting thread #15\r\nStarting thread #16\r\n10/10/2022 11:52:52: Waiting\r\n10/10/2022 11:52:53: Waiting\r\n10/10/2022 11:52:54: Waiting\r\n10/10/2022 11:52:55: Waiting\r\n10/10/2022 11:52:56: Waiting\r\n10/10/2022 11:52:57: Waiting\r\n10/10/2022 11:52:58: Waiting\r\n10/10/2022 11:52:59: Waiting\r\n10/10/2022 11:53:00: Waiting\r\n10/10/2022 11:53:01: Waiting\r\n10/10/2022 11:53:02: Waiting\r\n```\r\n\r\n\r\n### Error details\r\n\r\n_No response_\r\n\r\n### Environment data\r\n\r\n```powershell\r\nName Value\r\n---- -----\r\nPSVersion 7.2.6\r\nPSEdition Core\r\nGitCommitId 7.2.6\r\nOS Microsoft Windows 10.0.22621\r\nPlatform Win32NT\r\nPSCompatibleVersions {1.0, 2.0, 3.0, 4.0…}\r\nPSRemotingProtocolVersion 2.3\r\nSerializationVersion 1.1.0.1\r\nWSManStackVersion 3.0\r\n```\r\n\r\n\r\n### Visuals\r\n\r\n_No response_","author":{"url":"https://github.com/User1785604260","@type":"Person","name":"User1785604260"},"datePublished":"2022-10-10T14:53:34.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":9},"url":"https://github.com/18248/PowerShell/issues/18248"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:3ff75272-103a-25bd-d706-86dc3a285360 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | BE68:52B98:B2C23F:1019CD5:6A5F36CB |
| html-safe-nonce | b20db9a8cc1c5afa8326bc78a1a83191ef02b603c73b2700223f626284e129b1 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCRTY4OjUyQjk4OkIyQzIzRjoxMDE5Q0Q1OjZBNUYzNkNCIiwidmlzaXRvcl9pZCI6Ijc4Mjc4MzQ2NzMzNjQ0MTYyMDMiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | 3365bca9149fccac380873a8d822f412eafcf3bf8b20473b024d71b6e765a6e0 |
| hovercard-subject-tag | issue:1403306666 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/PowerShell/PowerShell/18248/issue_layout |
| twitter:image | https://opengraph.githubassets.com/446caf96e222e8710e04ee71a09cac803f0ea587980204a63ed5b2b993b31a01/PowerShell/PowerShell/issues/18248 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/446caf96e222e8710e04ee71a09cac803f0ea587980204a63ed5b2b993b31a01/PowerShell/PowerShell/issues/18248 |
| og:image:alt | Prerequisites Write a descriptive title. Make sure you are able to repro it on the latest released version Search the existing issues. Refer to the FAQ. Refer to Differences between Windows PowerSh... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | User1785604260 |
| hostname | github.com |
| expected-hostname | github.com |
| None | c80a2cb0221395c7c3987d7891fcde45641e27ea0bd3917b247d8fe154cf710f |
| turbo-cache-control | no-preview |
| go-import | github.com/PowerShell/PowerShell git https://github.com/PowerShell/PowerShell.git |
| octolytics-dimension-user_id | 11524380 |
| octolytics-dimension-user_login | PowerShell |
| octolytics-dimension-repository_id | 49609581 |
| octolytics-dimension-repository_nwo | PowerShell/PowerShell |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 49609581 |
| octolytics-dimension-repository_network_root_nwo | PowerShell/PowerShell |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 4cf24abec96dc3a7b39f364f737aca1e50991904 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width