/// <summary> /// Callback will be called for each SF... /// </summary> /// <param name="fullPaths"></param> /// <param name="callback"></param> public void LoadSFs(List <string> fullPaths, Action <string, ScriptFile> callback) { List <ScriptFile> filesForReading = new List <ScriptFile>(fullPaths.Count); foreach (string fullPath in fullPaths) { if (currentSFFiles.Contains(fullPath.ToLowerInvariant())) { continue; } ScriptFile sf = scriptManager.GetSFFromFullPath(fullPath); if (sf != null && (sf.SC == null || sf.ReadingState < ReadingState.CheckCode || sf.IsSourceFileUpdated())) { filesForReading.Add(sf); currentSFFiles.Add(fullPath.ToLowerInvariant()); //Main.Trace.TraceEvent(System.Diagnostics.TraceEventType.Verbose, 0, "PrePreparing for saving SF " + fullPath); } } filesForReading.TrimExcess(); //foreach (ScriptFile sf in filesForReading) //Main.Trace.TraceEvent(System.Diagnostics.TraceEventType.Verbose, 0, "PrePrePreparing for saving SF " + sf.SFFullPath); LoadSFsData data = new LoadSFsData(filesForReading, callback); Thread t = new Thread(DoLoadSFs); t.IsBackground = true; t.Name = "Loading SFs thread"; t.Start(data); }
private void DoLoadSFs(object data) { LoadSFsData loadSFsData = (LoadSFsData)data; while (!_isSMLoaded) { Thread.Sleep(50); } Main.Trace.TraceEvent(System.Diagnostics.TraceEventType.Verbose, 0, "DoLoadSFs(object data) 0, thread " + Thread.CurrentThread.Name + Thread.CurrentThread.GetHashCode()); Main.Trace.Flush(); //foreach (ScriptFile sf in loadSFsData.SFs) //Main.Trace.TraceEvent(System.Diagnostics.TraceEventType.Verbose, 0, "PrePrePrePreparing for saving SF " + sf.SFFullPath); try { scriptManager.ReadAssemblySFs(ReadingState.ScriptCode, loadSFsData.SFs); //foreach (ScriptFile sf in loadSFsData.SFs) //Main.Trace.TraceEvent(System.Diagnostics.TraceEventType.Verbose, 0, "PrePrePrePrePreparing for saving SF " + sf.SFFullPath); scriptManager.ReadAssemblySFs(ReadingState.CheckCode, loadSFsData.SFs); //foreach (ScriptFile sf in loadSFsData.SFs) //Main.Trace.TraceEvent(System.Diagnostics.TraceEventType.Verbose, 0, "PrePrePrePrePrePreparing for saving SF " + sf.SFFullPath); } catch (ThreadAbortException) { } catch (Exception e) { Main.NotifyError(e); } Main.Trace.TraceEvent(System.Diagnostics.TraceEventType.Verbose, 0, "DoLoadSFs(object data) 1, thread " + Thread.CurrentThread.Name + Thread.CurrentThread.GetHashCode()); Main.Trace.Flush(); foreach (ScriptFile sf in loadSFsData.SFs) { Main.Trace.TraceEvent(System.Diagnostics.TraceEventType.Verbose, 0, "After saving SF " + sf.SFFullPath); if (currentSFFiles.Contains(sf.SFFullPath.ToLowerInvariant())) { currentSFFiles.Remove(sf.SFFullPath.ToLowerInvariant()); } _currentUpdatedFiles.Add(sf); } foreach (ScriptFile sf in loadSFsData.SFs) { _dispatcher.Invoke(loadSFsData.Callback, sf.SFFullPath, sf); // have to be on the end } }