Как заблокировать доступ к DLL при совершении вызовов из нескольких потоков? - PullRequest
0 голосов
/ 09 мая 2019

Сбой моего приложения asp.net webapi, когда я звоню неуправляемой dll из нескольких потоков, созданных бомбардировкой запросов.У меня нет доступа к источнику DLL, и DLL не является потокобезопасным.

Приложение работает нормально, когда запросы выполняются последовательно, но становится нестабильным, когда несколько запросов выполняются параллельно.

Мое решение до сих пор заключалось в том, чтобы попытаться, если неудачная пауза в течение короткого периода времени, повторить попытку.Кажется, это работает, но я считаю, что должен быть лучший способ с мьютексами или с Windows API, или каким-то другим неизвестным мне решением.

Пример моего кода:

public class CDFReader : IDisposable
{
    public CDFReader(string path)
    {
        // open cdf file using dll
    }

    // other cdf extraction methods exist that require the dll
}


public class SomeOtherClass
{
    // function call to CDFReader that gets called from
    // multiple request threads
    public Records GetRecords()
    {
        using (var cdf = CDFReader(somefilepath))
        {
            // extract data from cdf using CDFReader methods
        }
    }
}

В настоящее время я исправляю свою проблему, включив блок using в попытку неудачного ожидания, но хотел бы заблокировать его из CDFReader.Таким образом, все, что делается с помощью CDFReader, обрабатывается автоматически, а не блокируется вокруг блока using.

Я открыт для любых предложений.

1 Ответ

0 голосов
/ 10 мая 2019

Используйте Named Mutex , чтобы заблокировать использование DLL для этого процесса.Единственный класс, который нуждается в этом, это CDFReader, но вы должны обязательно утилизировать CDFReader, когда вы закончите использовать его, чтобы избежать получения блокировки и никогда не снимать ее.

public class CDFReader : IDisposable
{
    private Mutext _myMutex = new Mutex(false, "CDFDLLMutex");

    public CDFReader(string path)
    {
        _myMutex.WaitOne();   //This locks the DLL for the life of the CDFReader
        // open cdf file using dll
    }

    // other cdf extraction methods exist that require the dll

    //In your dispose method (because this class is IDisposable) call _myMutex.ReleaseMutex() and _myMutex.Dispose()
}


public class SomeOtherClass
{
    // function call to CDFReader that gets called from
    // multiple request threads
    public Records GetRecords()
    {
        //No modification needed to this method
        using (var cdf = CDFReader(somefilepath))
        {
            // extract data from cdf using CDFReader methods
        }
    }
}

Я показываювыше, используя мьютекс для жизни CDFReader.Поскольку вы говорите, что это не «потокобезопасно» для DLL, я не уверен, хотите ли вы, чтобы мьютекс действовал на протяжении всего жизненного цикла CDFReader, или вы можете заблокировать только вызовы отдельных методов.

Если вы хотите заблокировать отдельные вызовы методов, просто вызовите (в том числе в конструкторе):

public void CDFMethod()
{
    _myMutex.WaitOne();    //With optional timeout
    //Do your processing in the method
    _myMutex.ReleaseMutex();
}

Но все равно обязательно .Dispose мьютекса, когда расположен CDFReader.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...