The following class is supposed to test, if an expected number of asynchronous Callbacks was received:
class Program
{
static List<int> callbackObjects = new List<int>();
static int expectedNumberOfCallbacks;
static void Main(string[] args)
{
expectedNumberOfCallbacks = 10;
Monitor.Enter(callbackObjects);
CallbackTest.CallbackTester.TriggerCallbacks(expectedNumberOfCallbacks,Callback);
Monitor.Wait(callbackObjects,10000);
Assert.AreEqual(callbackObjects.Count, expectedNumberOfCallbacks);
}
private static void Callback(int callbackObject)
{
callbackObjects.Add(callbackObject);
Console.WriteLine($"Callback number {callbackObjects.Count}");
if(callbackObjects.Count == expectedNumberOfCallbacks)
{
Monitor.Exit(callbackObjects);
}
}
}
The code outputs
Callback number 1
Callback number 2
Callback number 3
Callback number 4
Callback number 5
Callback number 6
Callback number 7
Callback number 8
Callback number 9
Callback number 10
but then it throws an
System.Threading.SynchronizationLockException: 'Object synchronization method was called from an unsynchronized block
on executing
Monitor.Exit(callbackObjects);
Is it because Monitor.Enter and Monitor.Exit are invoked in different scopes/threads?
How can I rewrite the code, to do the
Assert.AreEqual(callbackObjects.Count, expectedNumberOfCallbacks)
test in Main, either after the expected number of callbacks was received or a predefined timeout?