<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 12pt;
font-family:΢ź
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>i saw the bug you have opened, the behavior is pretty interesting, which is out of my expectation. thank you for the information.<br><br>     .Hzj_jie<br><br><div>> Subject: Re: [Mono-dev] a set of tests to find out the difference between .Net and Mono implementation<br>> From: jonpryor@vt.edu<br>> Date: Tue, 16 Sep 2014 12:31:37 -0400<br>> CC: mono-devel-list@lists.ximian.com<br>> To: hzj_jie@hotmail.com<br>> <br>> On Sep 16, 2014, at 6:10 AM, ӽHzj_jie <hzj_jie@hotmail.com> wrote:<br>> > 1. GC<br>> > thought GC.Collect() does not guarantee all the inaccessible objects are finalized and reclaimed, .Net implementation usually be able to delete all the inaccessible objects.<br>> > impacts, delegate_pinning_test, it make sure the delegate / event in .net will release the object after itself has been released.<br>> > weak_pointer_test, weak_pointer is a simple wrapper of WeakReference, which is strong-typed.<br>> > event_disposer_test, event_disposer is a strong-typed pointer, which provide disposing event when disposing.<br>> > lifetime_binder_test, lifetime_binder is a collection to avoid the object to be finalized.<br>> <br>> Developers need to write tests for finalizers, and writing tests for finalizers can be tricky for a variety of reasons. As such, it is quite possible that a GC-related test that "works" on .NET won't work on Mono w/o change.<br>> <br>> If you want to test your class' finalizer, then you need to use two threads + WeakReference:<br>> <br>>  WeakReference r = null;<br>>   var t = new Thread (() => {<br>>            var v = new ClassToTest ();<br>>               r = new WeakReference (t);<br>>        });<br>>       t.Start ();<br>>       t.Join ();<br>>        GC.Collect ();<br>>    GC.WaitForPendingFinalizers ();<br>> <br>>    // can now [0] check r.IsAlive, etc.<br>> <br>> The reason you create the instance + WeakReference on another thread is because Mono's GC will *conservatively* scan the thread's heap looking for valid references. By using a new thread *which exits*, the conservative stack scan will "skip" the exited thread, and thus won't find any valid references to the allocated instance. This in turn allows you to use the WeakReference to determine if the instance has in fact been collected. (Or not, if your ClassToTest registers itself with some static collection or something...)<br>> <br>>  - Jon<br>> <br>> [0]: https://bugzilla.xamarin.com/show_bug.cgi?id=20503<br>> <br></div>                                           </div></body>
</html>