Если вы начали выполнять метод для объекта expando в одном потоке и удалить этот метод в другом потоке, то он работает нормально:
dynamic a = new ExpandoObject();
a.Action1 = (Action)(() =>
{
Console.WriteLine("Action1 Start");
Thread.Sleep(1000);
Console.WriteLine("Action1 End");
});
Task task1 = Task.Factory.StartNew(() =>
{
a.Action1();
});
Task task2 = Task.Factory.StartNew(() =>
{
((IDictionary<String, Object>)a).Remove("Action1");
Console.WriteLine("Action1 Removed");
});
Task.WaitAll(task1, task2);
Вот еще один пример, когда метод постоянно добавляется и удаляется из объекта expando в одном потоке и вызывается в другом потоке. Исключение выдается здесь только при отсутствии метода:
dynamic a = new ExpandoObject();
Task task1 = Task.Factory.StartNew(() =>
{
while(true)
{
a.Action1 = (Action)(() => { Thread.Sleep(10); });
Thread.Sleep(100);
((IDictionary<String, Object>)a).Remove("Action1");
Thread.Sleep(100);
}
});
Task task2 = Task.Factory.StartNew(() =>
{
while(true)
{
try
{
a.Action1();
Console.WriteLine("Action1");
Thread.Sleep(20);
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}
});
Конечно, вам нужно убедиться, что код внутри метода объекта expando поточно-ориентирован.