public WorkerThreadParams(Task t) { T = t; State = WorkerThreadState.Loaded; }
public void StopWorkerThread() { if (_workerThread.IsAlive) { lock (_workerThreadSync) { _messageQueue.Enqueue(Message.Stop()); _cancelSearch = true; LocatorProject.CancelProjectLoad = true; Monitor.Pulse(_workerThreadSync); } _workerThread.Join(); _workerState = WorkerThreadState.NotStarted; } }
private void WorkerThreadFunc() { while (true) { Message message; lock (_workerThreadSync) { while (_searchMessage == null && _messageQueue.Count == 0) { lock (_workerThreadIdle) { _workerState = WorkerThreadState.Idle; Monitor.Pulse(_workerThreadIdle); } Monitor.Wait(_workerThreadSync); } _workerState = WorkerThreadState.Working; if (_messageQueue.Count > 0) { message = _messageQueue.Dequeue(); LocatorProject.CancelProjectLoad = false; } else // search message must be set { message = _searchMessage; _searchMessage = null; _cancelSearch = false; } } if (message.Type == MessageType.SearchString) { string searchStr = message.Text.TrimStart(); Regex regex = new Regex(@"\.\s+(.*)"); Match match = regex.Match(searchStr); if (match.Success) { searchStr = match.Groups[1].Value.ToUpper().TrimStart(); SearchCodeElements(searchStr); } else { if (searchStr.Length > 0) SearchFilesInSolution(searchStr); else RaiseSearchResultEventInUserThread(SearchResultEventArgs.ResultType.Error, 0); } } else if (message.Type == MessageType.ProjectLoaded) { object obj; string name; int result = message.Hierarchy.GetProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_Name, out obj); if (result == VSConstants.S_OK) name = obj as string; else name = string.Empty; RaiseSolutionEventInUserThread(SolutionEventArgs.EventType.ProjectLoading, "Loading project " + name); LocatorProject project = new LocatorProject(message.Hierarchy); _projectList.Add(project); RaiseSolutionEventInUserThread(SolutionEventArgs.EventType.ProjectFinishedLoading); } else if (message.Type == MessageType.ProjectUnloaded) { object obj; string name; int result = message.Hierarchy.GetProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_Name, out obj); if (result == VSConstants.S_OK) name = obj as string; else name = string.Empty; RaiseSolutionEventInUserThread(SolutionEventArgs.EventType.ProjectUnloading, "Unloading project " + name); _projectList.RemoveAll((LocatorProject prj) => { if (prj.Hierarchy == message.Hierarchy) { prj.StopListeningEvents(); return true; } return false; }); RaiseSolutionEventInUserThread(SolutionEventArgs.EventType.ProjectFinishedUnloading); } else if (message.Type == MessageType.Stop) { lock (_workerThreadIdle) { _workerState = WorkerThreadState.Idle; Monitor.Pulse(_workerThreadIdle); } break; } } }
public void StartWorkerThread() { if (!_workerThread.IsAlive) { _workerState = WorkerThreadState.Idle; _workerThread.Start(); } }