using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WeakReferenceTestConsole
{
class Program
{
static void Main(string[] args)
{
SampleData sampleData = new SampleData();
for (int i = 0; i < 3; i++)
{
WorkOnData(sampleData, i);
}
sampleData.RaiseSampleDataChanged("Sample Data change - Consumer outside scope");
// Force garbage collection
GC.Collect();
GC.WaitForPendingFinalizers();
sampleData.RaiseSampleDataChanged("Sample Data change - Consumer outside scope - After garbage collection");
Console.ReadKey();
}
private static void WorkOnData(SampleData sampleData, int iteration)
{
// Create a consumer which registers a method with the sample data objects SampleDataChanged event
Consumer consumer = new Consumer(sampleData);
consumer.Name = "Consumer " + iteration.ToString();
//Raise the sample data object's data changed event
sampleData.RaiseSampleDataChanged("Work on data - iteration : " + iteration.ToString());
}
}
public class Consumer
{
//private SampleData _sampleData;
public Consumer(SampleData sampleData)
{
//_sampleData = sampleData;
//sampleData.SampleDataChanged += new SampleData.SampleDataChangedEventHandler(Consumer_SampleDataChanged);
Observable.FromEvent<SampleDataChangedEventArgs>(sampleData, "SampleDataChanged").Subscribe(
args =>
Consumer_SampleDataChanged(sampleData, (SampleDataChangedEventArgs)args.EventArgs)
);
}
public string Name { get; set; }
void Consumer_SampleDataChanged(object sender, SampleDataChangedEventArgs e)
{
Console.WriteLine("Sample Data Changed : {0} - Notified Consumer : {1}", e.Message, this.Name);
}
~Consumer()
{
Console.WriteLine("Consumer finalizer");
}
}
public class SampleData
{
public event SampleDataChangedEventHandler SampleDataChanged;
public delegate void SampleDataChangedEventHandler(object sender, SampleDataChangedEventArgs e);
public void RaiseSampleDataChanged(string message)
{
SampleDataChangedEventHandler handler = SampleDataChanged;
if (handler != null)
{
SampleDataChangedEventArgs e = new SampleDataChangedEventArgs(message);
SampleDataChanged(this, e);
}
}
}
public class SampleDataChangedEventArgs : EventArgs
{
public SampleDataChangedEventArgs(string message)
{
this.Message = message;
}
public string Message { get; set; }
}
}