2012-02-02 11 views
7

La mia biblioteca utilizza la memoria isolata, ma lo fa solo su richiesta. Quindi sto usando Lazy<T>.Creazione sporca di memoria isolata

Tuttavia, questo getta:

System.IO.IsolatedStorage.IsolatedStorageException "Impossibile determinare l'autorizzazione concessa per il montaggio."

fa pigro fare qualcosa di strano con fili che confonde isolato l'inizializzazione di stoccaggio?

codice di esempio:

using System; 
using System.IO.IsolatedStorage; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var thisWorks = IsolatedStorageFile.GetMachineStoreForAssembly(); 
      thisWorks.Dispose(); 

      var lazyStorage = new Lazy<IsolatedStorageFile>(IsolatedStorageFile.GetMachineStoreForAssembly); 

      var thisFails = lazyStorage.Value; 
      thisFails.Dispose(); 
     } 
    } 
} 

traccia dello stack completa:

System.IO.IsolatedStorage.IsolatedStorageException was unhandled 
    Message=Unable to determine granted permission for assembly. 
    Source=mscorlib 
    StackTrace: 
    Server stack trace: 
     at System.IO.IsolatedStorage.IsolatedStorage.InitStore(IsolatedStorageScope scope, Type domainEvidenceType, Type assemblyEvidenceType) 
     at System.IO.IsolatedStorage.IsolatedStorageFile.GetMachineStoreForAssembly() 
     at System.Lazy`1.CreateValue() 
    Exception rethrown at [0]: 
     at System.IO.IsolatedStorage.IsolatedStorage.InitStore(IsolatedStorageScope scope, Type domainEvidenceType, Type assemblyEvidenceType) 
     at System.IO.IsolatedStorage.IsolatedStorageFile.GetMachineStoreForAssembly() 
     at System.Lazy`1.CreateValue() 
     at System.Lazy`1.LazyInitValue() 
     at System.Lazy`1.get_Value() 
     at ConsoleApplication1.Program.Main(String[] args) in C:\Users\Andrew Davey\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs:line 19 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 

risposta

6

sembra che sia perché si sta passando un MethodGroup (piuttosto che un delegato/lambda direttamente), ed è in grado di capire da dove originariamente proveniva la chiamata. Se si passa a questo:

var lazyStorage = new Lazy<IsolatedStorageFile>(() => IsolatedStorageFile.GetMachineStoreForAssembly()); 

Dovrebbe funzionare ok.

Problemi correlati