У меня есть библиотека с API, очень похожая на эту:
public class Library : IDisposable
{
public Library(Action callback);
public string Query();
public void Dispose();
}
После того, как я создаю экземпляр библиотеки, в любое время и в любом потоке она может вызвать обратный вызов, который я ей передал.Этот обратный вызов должен вызывать Query для выполнения полезной работы.Библиотека прекратит вызывать мой обратный вызов только после удаления, но если обратный вызов попытается вызвать Query после того, как основной поток вызвал Dispose, произойдет плохой материал .
I do хочет разрешить обратные вызовы для одновременного выполнения в нескольких потоках.Это нормально.Но мы должны быть уверены, что никакие обратные вызовы не могут быть запущены, когда мы вызываем Dispose.Я думал, что ReaderWriterLockSlim может быть уместным - вам нужна блокировка записи для вызова Dispose, а обратным вызовам нужны блокировки чтения для вызова Query.Проблема здесь в том, что ReaderWriterLockSlim является IDisposable, и я не думаю, что когда-либо будет безопасно утилизировать его - я никогда не могу знать, что в полете нет обратного вызова, который просто не дошел до точки получения чтениязаблокировать еще.
Что мне делать?Похоже, что ReaderWriterLock не IDisposable, но в собственной документации сказано, что вместо этого следует использовать ReaderWriterLockSlim.Я мог бы попытаться сделать что-то эквивалентное только с ключевым словом "lock", но это звучит расточительно и легко напортачить.
PS - Не стесняйтесь говорить, что API библиотеки не годится, если вы считаете, что это так,Я лично предпочел бы, чтобы это гарантировало, что Dispose будет блокироваться, пока все обратные вызовы не будут завершены.