给出这样的代码:
static void A() {
string input = "abcabcabc";
string pattern = "a";
string result = Regex.Replace(input, pattern, match => Evaluator(match));
}
static string Evaluator(Match match) {
return "d";
}
有没有办法像这样的委托使用async / await?
此:
static void B() {
string input = "abcabcabc";
string pattern = "a";
string result = Regex.Replace(input, pattern, async match => await EvaluatorAsync(match));
}
static async Task<string> EvaluatorAsync(Match match) {
return "d";
}
...不起作用 - 错误信息是&#39;异步方法的返回类型必须是无效的,任务或任务&#39;。
答案 0 :(得分:2)
您传递给Regex.Replace
的第三个参数必须是
[SerializableAttribute]
public delegate string MatchEvaluator(
Match match
)
您正在传递一个async
委托,其回复类型为Task<string>
。你可以做到
string result = Regex.Replace(input, pattern, match => EvaluatorAsync(match).Result);
但它会阻止,直到结果可用,这会破坏目的,it can cause a deadlock。由于this answer正则表达式中的强制搜索是CPU限制的,因此async
无法帮助您。您可以做的最好的事情是使用Task.Run
将工作推送到后台线程。