【发布时间】:2019-08-26 13:54:34
【问题描述】:
偶尔会有另一个线程开始执行我的代码。
// the main method:
// ...
MatchResultsForRules(rules, results);
ApplyRules(rules);
//...
public void MatchResultsForRules(List<Rule> Rules, List<SearchResult> Results)
{
foreach (Rule rule in Rules)
{
foreach (SearchResult res in Results)
{
if (isResultMatchRule(rule, res))
{
rule.searchResults.Add(res);
}
}
}
}
public void ApplyRules (List<Rule> Rules)
{
foreach (Rule rule in Rules)
{
foreach(SearchResult res in rule.searchResults)
{
ApplyRule(rule, res);
}
}
}
我知道还有另一个线程,因为一旦我看到问题发生(计算不匹配),我打印了一个详细的日志,包括每个操作的线程 ID,我看到操作顺序一团糟,当然还有两个不同的线程身份证。
我通过操纵搜索结果本身而不是操纵每个规则的搜索结果列表(如下所述)解决了这个问题。
修复:
public void ApplyRules (List<Rule> rules, List<SearchResult> searchResults)
{
foreach (Rule rule in rules)
{
foreach(SearchResult resFromRule in rule.searchResults)
{
SearchResult res = searchResults.First(
r => r.Id.Equals(resFromRule.Id)
);
ApplyRule(rule, res);
}
}
}
我只是想更好地理解这个问题,以免以后重蹈覆辙。
【问题讨论】:
-
你怎么知道有另一个线程搞砸了计算?
-
不幸的是,我们没有足够的代码来理解发生了什么。例如,你能给出调用 ApplyRules 的代码吗?
-
这是由用户击键启动的搜索吗?
-
难道所有 rule.SearchResults 实际上都引用了同一个列表?
-
@MaozHeiferman - 您需要提供足够的代码来复制您的问题。您所展示的任何内容都无法解释有关多线程的任何内容。
标签: c# multithreading thread-safety