Monitor.Enter
и Monitor.Exit
вызовы должны выполняться в одном потоке. В вашем примере вы вызываете Monitor.Enter
в потоке пользовательского интерфейса и Monitor.Exit
в потоке, созданном для асинхронного вызова, инициируемого BeginInvoke
.
Если вы хотите дождаться завершения асинхронной операции в Func
, вы можете сделать это следующим образом:
class Program
{
static void Main(string[] args)
{
Func();
Func();
Thread.Sleep(6000);
}
static void Func()
{
Action act = () =>
{
Thread.Sleep(2000);
};
IAsyncResult actAsyncResult = act.BeginInvoke(a =>
{
Console.WriteLine("exiting..");
}, null);
Console.WriteLine("Func done...");
act.EndInvoke(actAsyncResult);
}
}
Тем не менее, в вашем сценарии вы можете просто вызвать делегата синхронно.