gpt4 book ai didi

c# - 为任务创建 lambda 表达式

转载 作者:行者123 更新时间:2023-12-05 08:23:08 25 4
gpt4 key购买 nike

如何为返回字符串的任务创建 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;
}
}
}

最佳答案

You should never use the Task constructor 。实际上没有充分的理由使用它。

你的问题可以很自然地表达为一个单独的方法:

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

如果您真的想要一个async lambda 表达式(就我个人而言,我认为它不必要地混淆了代码),您可以内联移动单独的方法并将其分配给 asynchronous delegate type :

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

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

关于c# - 为任务创建 lambda 表达式<string>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49343071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com