c# - 在 C# 的 Action 中调用异步代码
问题描述
我正在从一些 C# 代码调用 Web 服务。此代码类似于:
using (var client = new HttpClient())
{
var page = "http://en.wikipedia.org/";
using (var response = await client.GetAsync(page))
{
using (var content = response.Content)
{
var result = await content.ReadAsStringAsync();
}
}
}
我想在实用程序方法中执行此代码。据我了解,Action委托适合此操作。我尝试使用以下方法来做到这一点:
Action action = delegate()
{
using (var client = new HttpClient())
{
var page = "http://en.wikipedia.org/";
using (var response = await client.GetAsync(page))
{
using (var content = response.Content)
{
var result = await content.ReadAsStringAsync();
}
}
}
}
当我将 Web 服务代码包装在Action
委托中时,我收到一个编译时错误,上面写着:
The 'await' operator can only be used within an async anonymous method. Consider marking this anonymous method with the 'async' modifier.
我的问题是,如何在 Action 中调用异步代码?看来我做不到。如果我不能,是否有另一种方法可以将代码块传递给实用程序方法以执行?那看起来像什么?
谢谢!
解决方案
您需要async
像标记任何方法一样标记您的操作,例如:
Action action = async delegate()
//snip
但是,这相当于async
void
不推荐的方法。相反,你们许多人考虑使用Func<Task>
而不是行动:
Func<Task> doStuff = async delegate()
{
using (var client = new HttpClient())
{
var page = "http://en.wikipedia.org/";
using (var response = await client.GetAsync(page))
{
using (var content = response.Content)
{
var result = await content.ReadAsStringAsync();
}
}
}
}
现在您可以等待结果:
await doStuff();
推荐阅读
- r - R:基于 URL 创建整洁的 df
- java - 如何设置 RSyntaxTextArea?
- python - 什么是 __globals__ 以及为什么可以通过类的 __init__ 访问它?
- node.js - 如何让 sequelize getter 与 findAll 一起工作
- elasticsearch - Elastic Search 搜索所有字段并提升精确匹配
- php - 代码有什么问题?我收到此警告。(PHP 警告:非法字符串偏移 'refferal')
- python - 在询问用户输入后,如何让我的代码对列表进行切片?
- python - Python:在多行字符串中使用变量
- c# - 带有 linux/arm64 的覆盆子上的 Docker 容器
- c - C中存在哪些类型的原型?