为任务创建 lambda 表达式<string>

Joh*_*ver 1 c# string asynchronous task

如何为返回字符串的任务创建 lambda 表达式?

这是我尝试过的,但出现错误。

感谢您的任何帮助。

public static async Task<string> GetStringAsync(string path)
    {
        try
        {
            var task = new Task<string>(async () =>
            {
                var response = await Client.GetAsync(path);

                var responsestring = await response.Content.ReadAsStringAsync();

                return responsestring;
            });

            return await Task.WhenAny(task, Task.Delay(20000)) == task
                ? task.Result
                : RequestTimeOutMessage;
        }
        catch (Exception e)
        {
            return e.GetBaseException().Message;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 6

你永远不应该使用Task构造函数。从字面上看,没有充分的理由使用它。

您的问题可以自然地表示为单独的方法:

public static async Task<string> GetStringAsync(string path)
{
  try
  {
    var task = DoGetStringAsync(path);

    return await Task.WhenAny(task, Task.Delay(20000)) == task
        ? await task
        : RequestTimeOutMessage;
  }
  catch (Exception e)
  {
    return e.GetBaseException().Message;
  }
}

private async Task<string> DoGetStringAsync(string path)
{
  var response = await Client.GetAsync(path);
  var responsestring = await response.Content.ReadAsStringAsync();
  return responsestring;
}
Run Code Online (Sandbox Code Playgroud)

如果你真的想要一个asynclambda 表达式(我个人认为它会不必要地混淆代码),你可以内联移动单独的方法并将它分配给一个异步委托类型

public static async Task<string> GetStringAsync(string path)
{
  try
  {
    Func<Task<string>> func = () =>
    {
      var response = await Client.GetAsync(path);
      var responsestring = await response.Content.ReadAsStringAsync();
      return responsestring;
    };
    var task = func();

    return await Task.WhenAny(task, Task.Delay(20000)) == task
        ? await task
        : RequestTimeOutMessage;
  }
  catch (Exception e)
  {
    return e.GetBaseException().Message;
  }
}
Run Code Online (Sandbox Code Playgroud)

附带说明一下,我建议对超时和通信错误使用异常,而不是特殊字符串。