使用async / await和预定义的委托签名

时间:2014-10-09 04:31:16

标签: c# delegates async-await

给出这样的代码:

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;。

1 个答案:

答案 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将工作推送到后台线程。