有没有像这样编写方法的场景:
public async Task<SomeResult> DoSomethingAsync()
{
// Some synchronous code might or might not be here... //
return await DoAnotherThingAsync();
}
Run Code Online (Sandbox Code Playgroud)
而不是这个:
public Task<SomeResult> DoSomethingAsync()
{
// Some synchronous code might or might not be here... //
return DoAnotherThingAsync();
}
Run Code Online (Sandbox Code Playgroud)
会有意义吗?
为什么return await在可以直接Task<T>从内部DoAnotherThingAsync()调用返回时使用构造?
我return await在很多地方看到代码,我想我应该错过一些东西.但据我了解,在这种情况下不使用async/await关键字并直接返回Task将在功能上等效.为什么要增加附加await层的额外开销?
我认为它们基本上是相同的 - 编写在处理器之间分割任务的程序(在具有2个以上处理器的机器上).然后我正在阅读https://msdn.microsoft.com/en-us/library/hh191443.aspx,其中说
异步方法旨在实现非阻塞操作.异步方法中的await表达式在等待的任务运行时不会阻止当前线程.相反,表达式将方法的其余部分作为延续进行注册,并将控制权返回给异步方法的调用者.
async和await关键字不会导致创建其他线程.异步方法不需要多线程,因为异步方法不能在自己的线程上运行.该方法在当前同步上下文上运行,并仅在方法处于活动状态时在线程上使用时间.您可以使用Task.Run将CPU绑定的工作移动到后台线程,但后台线程无助于正在等待结果可用的进程.
我想知道是否有人可以为我翻译成英文.它似乎区分了异步性(是一个单词?)和线程,并暗示你可以拥有一个具有异步任务但没有多线程的程序.
现在我理解异步任务的想法,例如pg上的示例.Jon Skeet的C#In Depth,第三版中的 467
async void DisplayWebsiteLength ( object sender, EventArgs e )
{
label.Text = "Fetching ...";
using ( HttpClient client = new HttpClient() )
{
Task<string> task = client.GetStringAsync("http://csharpindepth.com");
string text = await task;
label.Text = text.Length.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
该async关键字的意思是" 这个功能,无论何时它被调用时,不会在这是需要的一切它的完成被称为它的呼叫后,上下文调用."
换句话说,将它写在某个任务的中间
int x = 5;
DisplayWebsiteLength();
double y = Math.Pow((double)x,2000.0);
Run Code Online (Sandbox Code Playgroud)
,因为DisplayWebsiteLength()与"无关" x或y将导致DisplayWebsiteLength()"在后台"执行,如
processor 1 | processor 2
-------------------------------------------------------------------
int …Run Code Online (Sandbox Code Playgroud) c# parallel-processing multithreading asynchronous async-await
我正在尝试实现一个简单的日志库,它将用于多个项目.库的工作是将HTTP请求发送到ElasticSearch.这个库的要点是它不能等待响应.另外,我不关心任何错误/异常.它必须将请求发送到ElasticSearch,并立即返回.我不想用返回类型创建接口Task,我希望它们留下来void.
以下是我的示例代码.这是"火与忘"的正确和安全的实施吗?如果我Task.Run()在高负载库中使用它可以吗?或者我应该避免Task.Run()在我的情况下使用?另外,如果我不使用await带Task.Run(),将我阻塞线程?此代码在库中:
public enum LogLevel
{
Trace = 1,
Debug = 2,
Info = 3,
Warn = 4,
Error = 5,
Fatal = 6
}
public interface ILogger
{
void Info(string action, string message);
}
public class Logger : ILogger
{
private static readonly HttpClient _httpClient = new HttpClient(new HttpClientHandler { Proxy = null, UseProxy = false });
private static IConfigurationRoot _configuration;
public Logger(IConfigurationRoot configuration)
{
_configuration = …Run Code Online (Sandbox Code Playgroud) 我有一个关于 Webapi2 的问题
我的应用程序是完整的async/await,但我想优化最后一部分。我很难找到,那么有什么办法可以做到以下几点?
webapi2 控制器的示例:
private async Task<Foo> Barfoo(Bar foo)
{
//some async function
}
public async Task<IHttpActionResult> Foo(Bar bar)
{
List<Task> tasks=new List<Task>();
var actualresult=Barfoo(bar.Bar);
tasks.Add(actualresult);
foreach(var foobar in bar.Foo)
{
//some stuff which fills tasks
}
await Task.WhenAll(tasks);
return Ok(actualresult.Result);
}
Run Code Online (Sandbox Code Playgroud)
客户端只需要一个函数,所以我想要的更像是这样:
private async Task<Foo> Barfoo(Bar foo)
{
//some async function
}
public async Task<IHttpActionResult> Foo(Bar bar)
{
List<Task> tasks=new List<Task>();
var actualresult=Barfoo(bar.Bar);
return Ok(actualresult.Result);
foreach(var foobar in bar.Foo)
{
//some stuff which fills tasks …Run Code Online (Sandbox Code Playgroud) c# ×4
async-await ×3
asynchronous ×3
.net ×1
.net-4.5 ×1
asp.net-core ×1
optimization ×1
task ×1