I think I may have solved the issue although I have been hesitant to post since my train of logic takes a few intuitive leaps that I can't 100% say are right.
If I look in my Application event log I see the following errors which I believe are related to the problem:
Log Name: Application
Source: SharpShell
Date: 11/30/2016 10:19:20 PM
Event ID: 0
Task Category: None
Level: Error
Keywords: Classic
User: N/A
Computer: ******
Description:
System.IO.IOException: The process cannot access the file 'D:\Users\******\AppData\Local\Temp\LockedByOtherIconOverlay.ico' because it is being used by another process.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.File.InternalDelete(String path, Boolean checkHost)
at SharpShell.SharpIconOverlayHandler.SharpIconOverlayHandler.CreateTemporaryIconFilePath()
at SharpShell.SharpIconOverlayHandler.SharpIconOverlayHandler.GetIconFilePath()
Event Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="SharpShell" />
<EventID Qualifiers="0">0</EventID>
<Level>2</Level>
<Task>0</Task>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2016-12-01T03:19:20.218324100Z" />
<EventRecordID>6228</EventRecordID>
<Channel>Application</Channel>
<Computer>******</Computer>
<Security />
</System>
<EventData>
<Data>System.IO.IOException: The process cannot access the file 'D:\Users\******\AppData\Local\Temp\LockedByOtherIconOverlay.ico' because it is being used by another process.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.File.InternalDelete(String path, Boolean checkHost)
at SharpShell.SharpIconOverlayHandler.SharpIconOverlayHandler.CreateTemporaryIconFilePath()
at SharpShell.SharpIconOverlayHandler.SharpIconOverlayHandler.GetIconFilePath()</Data>
</EventData>
</Event>
Log Name: Application
Source: SharpShell
Date: 11/30/2016 10:19:20 PM
Event ID: 0
Task Category: None
Level: Error
Keywords: Classic
User: N/A
Computer: ******
Description:
LockedByOtherIconOverlay: An exception occured when trying to create the overlay icon.
Event Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="SharpShell" />
<EventID Qualifiers="0">0</EventID>
<Level>2</Level>
<Task>0</Task>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2016-12-01T03:19:20.214822100Z" />
<EventRecordID>6227</EventRecordID>
<Channel>Application</Channel>
<Computer>******</Computer>
<Security />
</System>
<EventData>
<Data>LockedByOtherIconOverlay: An exception occured when trying to create the overlay icon.</Data>
</EventData>
</Event>
Log Name: Application
Source: SharpShell
Date: 11/30/2016 10:19:20 PM
Event ID: 0
Task Category: None
Level: Error
Keywords: Classic
User: N/A
Computer: ******
Description:
LockedIconOverlay: Cannot create the overlay icon path.
Event Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="SharpShell" />
<EventID Qualifiers="0">0</EventID>
<Level>2</Level>
<Task>0</Task>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2016-12-01T03:19:20.121260900Z" />
<EventRecordID>6226</EventRecordID>
<Channel>Application</Channel>
<Computer>******</Computer>
<Security />
</System>
<EventData>
<Data>LockedIconOverlay: Cannot create the overlay icon path.</Data>
</EventData>
</Event>
So this clues me in that there is a problem with Sharpshell a programming framework used to do things on the desktop. If I look at the next earlier error in the same log I see this:
Log Name: Application
Source: Microsoft-Windows-EFS
Date: 11/30/2016 10:18:49 PM
Event ID: 4401
Task Category: None
Level: Error
Keywords:
User: ******
Computer: ******
Description:
7.488: EFS service failed to provision a user for EDP. Error code: 0x80070005.
Event Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="Microsoft-Windows-EFS" Guid="{3663A992-84BE-40EA-BBA9-90C7ED544222}" />
<EventID>4401</EventID>
<Version>0</Version>
<Level>2</Level>
<Task>0</Task>
<Opcode>0</Opcode>
<Keywords>0x4000000000000000</Keywords>
<TimeCreated SystemTime="2016-12-01T03:18:49.673203100Z" />
<EventRecordID>6213</EventRecordID>
<Correlation />
<Execution ProcessID="708" ThreadID="744" />
<Channel>Application</Channel>
<Computer>******</Computer>
<Security UserID="S-1-5-21-1718568706-243744021-1236795852-12983" />
</System>
<UserData>
<EfsLogStringError xmlns="http://manifests.microsoft.com/win/2004/08/windows/eventlog">
<FileNumber>7</FileNumber>
<LineNumber>488</LineNumber>
<ErrorCode>0x80070005</ErrorCode>
</EfsLogStringError>
</UserData>
</Event>
A search on "efs 0x80070005" reveals https://answers.microsoft.com/en-us/windows/forum/windows_10-security/event-4401-efs-service-failed-to-provision-a-user/4ea56f31-928e-488f-82c3-7347bc6e862c which is a Microsoft community post talking about a problem with the encrypted file service. I wouldn't think that this was related except the Sharpshell problem seems to be a problem with accessing files and folders.
So after reading more at
http://answers.microsoft.com/en-us/windows/forum/windows8_1-hardware/cryptographic-services-failed-while-processing-the/c4274af3-79fb-4412-8ca5-cee721bda112?page=13 , I ran the following from an elevated command prompt:
sc sdset MSLLDP D:(D;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BG)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SY)(A;;CCDCLCSWRPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWRPWPDTLOCRRC;;;SO)(A;;LCRPWP;;;S-1-5-80-3141615172-2057878085-1754447212-2405740020-3916490453)(A;;CC;;;S-1-5-80-242729624-280608522-2219052887-3187409060-2225943459)
I rebooted my system, and have had no more issues with Fences since then. I checked my application logs again and while I still see errors with both Sharpshell and EFS, they are not as frequent (maybe once in a week).
My final conclusion is that I haven't fixed the problem, but I may have bandaided it. I hope this helps.