Thread-safe removewhere
Firstly, the biggest problem is that ReaderWriterLockSlim implements IDisposable so your DeviceLocator class should too as it holds a reference at the class level.



You could make better use of the locks if you moved things round a bit:

public void AddLocators(IEnumerable&lt;DeviceLocator&gt; locators)
{
    cacheLock.EnterWriteLock();
    foreach (DeviceLocator locator in locators)
    {
        AddLocatorUnsafe(locator);
    }
    cacheLock.ExitWriteLock();
}

private void AddLocatorUnsafe(DeviceLocator locator)
{
    m_deviceList.RemoveWhere(x =&gt; x.CompanyID == locator.CompanyID 
            &amp;&amp; x.SerialNumber == locator.SerialNumber);

    m_deviceList.Add(locator);
}


Now you only acquire the lock once and do everything while holding that lock instead of having to keep acquiring and releasing between items.



Don't do this:

try
{
    // ...
}
catch
{
   throw;
}
finally
{
    // ...
}


That catch block is entirely redundant - remove it.



Some people would probably tell you off for using regions. I'm not really that fussed about it but you should be aware that a lot of C# developers don't like using regions for splitting up classes.