[Mono-bugs] [Bug 653928] New: Delegate.BeginInvoke from thread-pool thread does NOT run until it exits

bugzilla_noreply at novell.com bugzilla_noreply at novell.com
Tue Nov 16 07:13:59 EST 2010


https://bugzilla.novell.com/show_bug.cgi?id=653928

https://bugzilla.novell.com/show_bug.cgi?id=653928#c0


           Summary: Delegate.BeginInvoke from thread-pool thread does NOT
                    run until it exits
    Classification: Mono
           Product: Mono: Runtime
           Version: 2.8.x
          Platform: x86
        OS/Version: Windows XP
            Status: NEW
          Severity: Normal
          Priority: P5 - None
         Component: misc
        AssignedTo: mono-bugs at lists.ximian.com
        ReportedBy: andyhume32 at yahoo.co.uk
         QAContact: mono-bugs at lists.ximian.com
          Found By: ---
           Blocker: ---


Created an attachment (id=400473)
 --> (http://bugzilla.novell.com/attachment.cgi?id=400473)
C# code file containing repro code as described.

User-Agent:       Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1;
Trident/4.0; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30; .NET
CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR
3.5.30729; .NET4.0C; .NET4.0E)

Tested in 2.8 (release).
Only tested on WinXP.

If Delegate.BeginInvoke is called from a thread-pool thread then the target
delegate method is *only* run *after* the original thread-pool thread exits.

(I can't really I'm seeing this but its 100% reproducible...)

With the code sample at the bottom we see the following.
* On MSFT and on Mono 2.6.3 (e.g.):
[[
223240953: Calling outer.BeginInvoke
223240953: Outer: calling inner.BeginInvoke
223240953: Outer: pausing...
223240953:     Inner: Was I called only **after** Outer exited??????
223242953: Outer: exiting...
]]

* But on Mono 2.8 we see: :-(
[[
223244187: Calling outer.BeginInvoke
223244390: Outer: calling inner.BeginInvoke
223244390: Outer: pausing...
223246390: Outer: exiting...
223246390:     Inner: Was I called only **after** Outer exited??????
]]

Note the second BeginInvoke does NOT run until the first thread-pool method
exits.  (Note the same occurs if ThreadPool.QueueUserWorkItem is used to run
the 'outer' method, so its not a problem with BeginInvoke within BeginInvoke).


Code sample, (full code attached):
[[
static void SimpleTest()
{
    int msForOuterToDelay = 2000;
    //
    WaitCallback inner = delegate {
        Console_WriteLine("    Inner: Was I called only **after** Outer
exited??????");
    };
    //
    WaitCallback outer = delegate {
        Console_WriteLine("Outer: calling inner.BeginInvoke");
        var arI = inner.BeginInvoke(null, null, null);
        //
        Console_WriteLine("Outer: pausing...");
        Thread.Sleep(msForOuterToDelay);
        Console_WriteLine("Outer: exiting...");
    };
    //
    Console_WriteLine("Calling outer.BeginInvoke");
    var arO = outer.BeginInvoke(null, null, null);
    //
    Thread.Sleep(msForOuterToDelay);
    Thread.Sleep(msForOuterToDelay);
}
]]

Reproducible: Always

Steps to Reproduce:
See attached code sample.

-- 
Configure bugmail: https://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
You are the assignee for the bug.


More information about the mono-bugs mailing list