在任务返回异步方法结束时,如果我调用另一个异步方法,我可以使用await它或return它的任务.每个的后果是什么?
Task FooAsync()
{
return BazAsync(); // Option A
}
async Task BarAsync()
{
await BazAsync(); // Option B
}
Run Code Online (Sandbox Code Playgroud) 我有一个异步方法,GetExpensiveThing()它执行一些昂贵的I/O工作.这就是我使用它的方式:
// Serial execution
public async Task<List<Thing>> GetThings()
{
var first = await GetExpensiveThing();
var second = await GetExpensiveThing();
return new List<Thing>() { first, second };
}
Run Code Online (Sandbox Code Playgroud)
但由于这是一种昂贵的方法,我想并行执行这些调用.我本以为移动等待会解决这个问题:
// Serial execution
public async Task<List<Thing>> GetThings()
{
var first = GetExpensiveThing();
var second = GetExpensiveThing();
return new List<Thing>() { await first, await second };
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,所以我将它们包装在一些任务中,这有效:
// Parallel execution
public async Task<List<Thing>> GetThings()
{
var first = Task.Run(() =>
{
return GetExpensiveThing();
});
var second = Task.Run(() =>
{ …Run Code Online (Sandbox Code Playgroud) 鉴于以下ASP.NET MVC 4控制器操作:
public async Task<ActionResult> FooAsync()
{
using (var httpClient = new HttpClient())
{
var responseMessage = await httpClient.GetAsync("http://stackoverflow.com");
string response = await responseMessage.Content.ReadAsStringAsync();
return Content(response);
}
}
Run Code Online (Sandbox Code Playgroud)
我是否需要在FooAsync中添加 "Async"后缀才能异步运行操作?
简介:在库方法中,何时应该使用async和await关键字而不是Task直接返回?
我相信我的问题与此问题有关.但是,这个问题是关于.NET 4.0和TPL,而我正在使用.NET 4.6 async和await关键字.所以,我认为我的问题可能得到不同的答案,因为在回答链接问题时这些关键字不存在.
说明:我正在为外部WCF服务编写一个简单的包装器,并且包装器会进行多次SendAsync调用.现在我认为每个包装器方法都应该直接返回Task<>,而不必等待.我的理解是async/ await应该在应用层上使用,而不是在库中.
因此,例如,我认为我应该为每个包装器方法采用的方法:
private Task<SignResponse> GetSignDataAsync(SigningRequestType request)
{
return _service.SendAsync(request);
}
Run Code Online (Sandbox Code Playgroud)
但是在互联网上,我找到了几个使用这种方法的帖子:
private async Task<SignResponse> GetSignDataAsync(SigningRequestType request)
{
return await _service.SendAsync(request).ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)
这是我在technet上找到的另一个例子:
async Task PutTaskDelay()
{
await Task.Delay(5000);
}
private async void btnTaskDelay_Click(object sender, EventArgs e)
{
await PutTaskDelay();
MessageBox.Show("I am back");
}
Run Code Online (Sandbox Code Playgroud)
那么,我何时应该使用第二种方法(包含 …
APM使用BeginXXX/EndXX对,基于事件的异步模式(EAP)使用XXXAsync和XXXCompleted对,但我没有看到任何关于如何命名返回任务的方法的标准.
我一直在使用XXXTask:
Data GetData()
Task<Data> GetDataTask()
Run Code Online (Sandbox Code Playgroud)
但是想知道是否已经开发出更标准的方法
考虑这两个扩展方法,它们只是从任何类型T1到的简单映射T2,加上一个重载以流畅地映射到Task<T>:
public static class Ext {
public static T2 Map<T1, T2>(this T1 x, Func<T1, T2> f)
=> f(x);
public static async Task<T2> Map<T1, T2>(this Task<T1> x, Func<T1, T2> f)
=> (await x).Map(f);
}
Run Code Online (Sandbox Code Playgroud)
现在,当我使用第二个重载映射到引用类型时......
var a = Task
.FromResult("foo")
.Map(x => $"hello {x}"); // ERROR
var b = Task
.FromResult(1)
.Map(x => x.ToString()); // ERROR
Run Code Online (Sandbox Code Playgroud)
...我收到以下错误:
CS0121:以下方法或属性之间的调用不明确:“Ext.Map(T1, Func)”和“Ext.Map(Task, Func)”
映射到值类型工作正常:
var c = Task
.FromResult(1)
.Map(x => x + 1); // works
var …Run Code Online (Sandbox Code Playgroud) 我刚刚将Visual Studio 2015 ASP.NET MVC Core项目转换为Visual Studio 2017 ...我在错误列表中收到以下信息性消息
消息IDE1006命名规则违规:缺少后缀:'异步'
此消息出现在我的控制器中,重点关注以下内容:
public async Task<IActionResult> Index()
Run Code Online (Sandbox Code Playgroud)
这也适用于创建,删除,详细信息和编辑.消息显示为信息,并适用于我的项目中超过1,000次出现.看来我需要将Index改为IndexAsync ie.
改变自:
public async Task<IActionResult> Index()
public async Task<IActionResult> Create()
public async Task<IActionResult> Delete(int? id)
public async Task<IActionResult> Details(int? id)
Run Code Online (Sandbox Code Playgroud)
改成:
public async Task<IActionResult> IndexAsync()
public async Task<IActionResult> CreateAsync()
public async Task<IActionResult> DeleteAsync(int? id)
public async Task<IActionResult> DetailsAysnc(int? id)
Run Code Online (Sandbox Code Playgroud)
这似乎是可选的,因为我的项目将构建并且它不是VS 2015中的问题.我不介意做这项工作,我需要确认在Visual Studio 2017 ASP.NET Core中更改它是正确的方法.
应该在将要异步执行的方法名称中添加一个 Async 前缀。与在 MS EF Core 中一样,所有运行 async 的方法都有 async 前缀。但它们也有同步方法,没有同步前缀。
在某些方法设计为并行运行的情况下有什么建议。
寻求建议。
c# ×6
async-await ×4
.net ×2
asynchronous ×2
.net-4.6 ×1
asp.net-mvc ×1
coding-style ×1
generics ×1