c# – 暂停一个线程直到一个方法和所有内部线程完成他们的工作?
我是线程的新手,我想知道如何使用它们在非确定性有限自动机中进行评估.
我有调用另一个方法的方法: public bool Evaluate2(string s) { accepted = false; ThreadEval(s,StartState); return accepted; } 变量接受是一个类成员,我用它来控制其他线程何时应该停止. void ThreadEval(string s,State q) { if (s.Length == 0 && q.IsFinal) { accepted = true; return; } bool found = true; State current = q; for (int i = 0; found && !accepted && i < s.Length; i++) { found = false; foreach (Transition t in current.transitions) if (t.symbol == s[i]) { Thread thread = new Thread(new ThreadStart(delegate { ThreadEval(s.Substring(i+1),t.to); })); thread.Start(); found = true; } } } 我的每个州都有一组过渡.转换由符号和消耗该符号的状态组成.因此,每当找到可能的转换时,我想创建一个新线程并检查字符串的其余部分(没有当前字符)… 我目前遇到两个问题: >在ThreadEval内创建的所有线程完成之前,正在执行“return accepted”.有没有办法确保它不会返回,直到那些线程结束? 如果有人对如何使用更优雅的线程有任何建议,我将不胜感激,到目前为止,我发现在线程分配的函数中传递参数的唯一方法是使用委托. 解决方法
为了阻塞直到线程t执行完成,您可以使用Thread.Join.
t.Join(); 这将主线程置于IDLE状态,直到线程t完成. 更好的方法是使用TPL的任务< T>而不是直接使用线程.你的代码有点像这样: Task ThreadEval(string s,State q) { //... List<Task> tasks = new List<Task>(); for (int i = 0; found && !accepted && i < s.Length; i++) { found = false; foreach (Transition t in current.transitions) if (t.symbol == s[i]) { tasks.Add( Task.Run( () => await ThreadEval(s.Substring(i+1),t.to))); found = true; } } return Task.WhenAll(tasks); } await ThreadEval(...); >更改签名以返回Task而不是void 然后调用者将等待ThreadEval. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |