Handle disposed AsyncWaitHandle during BeginInvoke completion - #14998
Handle disposed AsyncWaitHandle during BeginInvoke completion#14998jaywang-cn wants to merge 1 commit into
Conversation
|
Thanks for the excellent report and focused fix. |
KlausLoeffelmann
left a comment
There was a problem hiding this comment.
LGTM!
Thanks for your contribution!
There was a problem hiding this comment.
🟢 Approval recommended
Pull request overview
This PR hardens WinForms Control.BeginInvoke completion so that a consumer-disposed IAsyncResult.AsyncWaitHandle no longer causes an ObjectDisposedException on the UI thread during marshaled callback completion.
Changes:
- Catch and tolerate
ObjectDisposedExceptionwhenThreadMethodEntry.Complete()signals the internalManualResetEvent. - Add a regression test ensuring the marshaled callback still runs and the returned
IAsyncResultreports completion even ifAsyncWaitHandleis disposed.
File summaries
| File | Description |
|---|---|
| src/System.Windows.Forms/System/Windows/Forms/Control.ThreadMethodEntry.cs | Wraps completion signaling (_resetEvent?.Set()) in an ObjectDisposedException handler to prevent UI-thread crashes when the wait handle is externally disposed. |
| src/test/unit/System.Windows.Forms/System/Windows/Forms/ControlTests.Methods.cs | Adds a regression test that disposes AsyncWaitHandle before invoking marshaled callbacks and verifies callback execution and IsCompleted. |
Review details
- Files reviewed: 2/2 changed files
- Comments generated: 0
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| { | ||
| _resetEvent?.Set(); | ||
| } | ||
| catch (ObjectDisposedException) |
There was a problem hiding this comment.
Instead of catching an exception, can we check: if(!_marshaler.IsDisposed)
There was a problem hiding this comment.
No. We could have the waitHandle disposed ...
IAsyncResult result = control.BeginInvoke(callback);
result.AsyncWaitHandle.Dispose();
... but not the marshaling control.
|
@jaywang-cn please read the following Contributor License Agreement(CLA). If you agree with the CLA, please reply with the following information.
Contributor License AgreementContribution License AgreementThis Contribution License Agreement ( “Agreement” ) is agreed to by the party signing below ( “You” ), 1. Definitions. “Code” means the computer software code, whether in human-readable or machine-executable form, “Project” means any of the projects owned or managed by .NET Foundation and offered under a license “Submit” is the act of uploading, submitting, transmitting, or distributing code or other content to any “Submission” means the Code and any other copyrightable material Submitted by You, including any 2. Your Submission. You must agree to the terms of this Agreement before making a Submission to any 3. Originality of Work. You represent that each of Your Submissions is entirely Your 4. Your Employer. References to “employer” in this Agreement include Your employer or anyone else 5. Licenses. a. Copyright License. You grant .NET Foundation, and those who receive the Submission directly b. Patent License. You grant .NET Foundation, and those who receive the Submission directly or c. Other Rights Reserved. Each party reserves all rights not expressly granted in this Agreement. 6. Representations and Warranties. You represent that You are legally entitled to grant the above 7. Notice to .NET Foundation. You agree to notify .NET Foundation in writing of any facts or 8. Information about Submissions. You agree that contributions to Projects and information about 9. Governing Law/Jurisdiction. This Agreement is governed by the laws of the State of Washington, and 10. Entire Agreement/Assignment. This Agreement is the entire agreement between the parties, and .NET Foundation dedicates this Contribution License Agreement to the public domain according to the Creative Commons CC0 1. |
Summary
ObjectDisposedExceptionwhenThreadMethodEntry.Completesignals anAsyncWaitHandledisposed by its consumerFixes #14996
Testing
dotnet test src/test/unit/System.Windows.Forms/System.Windows.Forms.Tests.csproj --no-restore -- --filter-method System.Windows.Forms.Tests.ControlTests.Control_BeginInvoke_DisposedAsyncWaitHandle_CompletesCallback(1 passed)Microsoft Reviewers: Open in CodeFlow