public delegate void FileEventHandler(string file); public event FileEventHandler fileEvent; public void getAllFiles(string path) { foreach (string item in Directory.GetDirectories(path)) { try { getAllFiles(item); } catch (Exception) { } } foreach (string str in Directory.GetFiles(path, "*.pcap")) { // process my file and if this file format OK raised event to UI and add the file to my listbox FileChecker fileChecker = new FileChecker(); string result = fileChecker.checkFIle(str); if (result != null) fileEvent(result); } } private void btnAddDirInput_Click(object sender, EventArgs e) { ThreadStart ts = delegate { getAllFiles(pathToSearch); }; Thread thread = new Thread(ts); thread.IsBackground = true; thread.Start(); } I want to wait until thread has finish its job and then update my UI