当我不需要响应时,无需等待即可使用异步
我想从我的应用发送短信。当我向特定URL发送获取请求时,SMS会发送。我所有的方法都是异步的,但是当我实例化一个HttpClient
并且想要使用response.Content.ReadAsStringAsync()
时,我删除了await
。当我不需要响应时,无需等待即可使用异步
我不想等待此方法的响应,并且只想向该URL发送请求。现在你能告诉我这是一个很好的解决方案吗?
这是我的示例代码:
public async Task<bool> SendMessage(string number, string body)
{
var from = _config["SMSSenderSettings:FromNumber"];
var username = _config["SMSSenderSettings:PanelUserName"];
var password = _config["SMSSenderSettings:PanelPassword"];
using (var client = new HttpClient())
{
try
{
var response = await client.GetAsync($"{BaseUrl}/send.php?method=sendsms&format=json&from={from}" +
$"&to={number}&text={body}&type=0&username={username}&password={password}");
response.EnsureSuccessStatusCode(); // Throw exception if call is not successful
response.Content.ReadAsStringAsync();
return true;
}
catch (HttpRequestException)
{
return false;
}
}
}
我从response.Content.ReadAsStringAsync();
删除await
,我也得到警告。
如果你不想等待你的任务,你可以删除不需要的返回类型
public async Task SendMessage(string number, string body)
{
var from = _config["SMSSenderSettings:FromNumber"];
var username = _config["SMSSenderSettings:PanelUserName"];
var password = _config["SMSSenderSettings:PanelPassword"];
using (var client = new HttpClient())
{
try
{
var response = await client.GetAsync($"{BaseUrl}/send.php?method=sendsms&format=json&from={from}" +
$"&to={number}&text={body}&type=0&username={username}&password={password}");
response.EnsureSuccessStatusCode(); // Throw exception if call is not successful
await response.Content.ReadAsStringAsync();
}
catch (HttpRequestException)
{
}
}
}
然后你可以从另一个调用方法SendMessage
喜欢 -
await SendMessage().ConfigureAwait(false);
注 :不建议这样做,因为您不知道您的任务是否成功完成。
还有其他的方法可以实现你想要的。你可能会读几these-
How to run async task without need to await for result in current function/thread?
谢谢@Souvik,ConfigureAwait(false)是我需要的。我读过你介绍的线索,但他们不是我的。 –
@HusseinJahanbakhsh很高兴为你工作。 –
这不是一个好主意,在某处你的代码,你应该await
/Wait
/.Result
的Task
否则任何未处理的异常将提高到应用程序级别见docs
这就是氡的警告,编译器不想让你自己拍摄脚。如果您真的想继续这样做,只需将任务放入一个变量中,而不要使用它,尽管其他静态分析工具可能会标记这一点。
var t = response.Content.ReadAsStringAsync();
或者如果不需要调用来完成请求,则可以考虑完全删除它。
谢谢@Titian Cernicova-Dragomir,但如果我删除这一行,请求永远不会发送到URL。 –
如果不需要响应内容,则根本不要读取内容。当你可以避免时,你不应该抛出异常。
有了,你可以有一个更清洁的代码
public async Task<bool> SendMessage(string number, string body)
{
var from = _config["SMSSenderSettings:FromNumber"];
var username = _config["SMSSenderSettings:PanelUserName"];
var password = _config["SMSSenderSettings:PanelPassword"];
using (var client = new HttpClient())
{
var response = await client.GetAsync($"{BaseUrl}/send.php?method=sendsms&format=json&from={from}" +
$"&to={number}&text={body}&type=0&username={username}&password={password}");
return response.IsSuccessStatusCode();
}
}
这不是一个好主意,在某处你的代码,你应该'await' /'Wait' /'.Result'任务,否则任何未处理的异常将升至应用程序级别https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/exception-handling-task-parallel-library –
如果您不需要该内容,则不要阅读内容。只要删除整条线。 –