Насколько небезопасно передавать DangerousHandle AutoResetEvent в собственную библиотеку? - PullRequest
0 голосов
/ 28 августа 2018

Контекст: Моя ситуация такова, что мне приходится использовать внешнюю написанную нативную библиотеку из управляемой среды .net. Эта нативная библиотека отправляет сообщения в реальном времени в мое приложение с небольшими интервалами. От моего заявления ожидается ответ в течение определенного периода времени. Когда это требование не выполняется, ситуация исправима, но это замедляет работу приложения для пользователя. Было много проблем со скоростью реакции, которые были решены путем добавления события AutoResetEvent в сочетании с ожидающим его потоком.

Проблема: библиотека предоставляет метод, с помощью которого я могу передать указатель на дескриптор из AutoResetEvent. Я передаю эту ручку как Uint.

var handle = resetEvent.SafeWaitHandle.DangerousGetHandle();
var pointer = (uint)handle.ToInt32();
SetParameterValue(channel, param, pointer, 4); 

И этот дескриптор передается следующему методу:

[DllImport("PCANBasic.dll", EntryPoint = "CAN_SetValue")]
private static extern NativeCanStatus SetParameterValue(
        ushort Channel,
        byte Parameter,
        uint Handle,
        uint BufferLength);

Кажется, все работает отлично. Однако я просто написал некоторый код, который я не понимаю внутренней работы. Название DangerousGetHandle не совсем убедительно. Когда приложение закрыто, я устанавливаю параметр в нулевой указатель, однако я не могу гарантировать, что в случае сбоя приложения я установлю этот параметр в нулевой указатель. Кажется, это не вызывает никаких проблем, но я не понимаю, почему это не вызывает у меня никаких проблем.

Итак, насколько небезопасно передавать DangerousHandle AutoResetEvent в собственную библиотеку? Может ли нативная библиотека после сбоя приложения продолжать вызывать что-то по этому указателю? Или это прекрасно?

...