在具有同步逻辑 C# 的异步任务方法中等待



我有一个愚蠢的问题要问大家学习一些最佳实践 c# 中的异步返回类型。我有这样的方法:

public virtual async Task OnConnected(WebSocket socket, HttpContext context)
{
string connectionId = CreateConnectionId(context);
ConnectionManager.AddSocket(connectionId, socket);
//Question is here await what ?
}

我想发布以改进我的应用程序,使其具有异步和等待的最佳性能。请不要拇指拇指我的帖子。每个人都可以为我建议一些资源最佳实践异步返回类型吗?

谢谢大家。

如果没有什么可await的,这是一个被覆盖的方法。只需忽略编译器警告(或pragma已发出(,什么也不做。

为什么什么都不做?

因为当您对方法放置async时,编译器会自动为您在任务上放置任何异常。

或者,您可以删除async并返回已完成的任务

public virtual Task OnConnected(WebSocket socket, HttpContext context)
{
string connectionId = CreateConnectionId(context);
ConnectionManager.AddSocket(connectionId, socket);
return Task.CompletedTask;
}

我的建议是做前者,(什么都不做(

但是,如果要采用第二种方法,最好像异步和等待模式一样在返回的任务上放置任何异常。

public virtual  Task OnConnected(WebSocket socket, HttpContext context)
{
try
{
string connectionId = CreateConnectionId(context);
ConnectionManager.AddSocket(connectionId, socket);
// more stuff
return Task.CompletedTask;
}
catch (Exception e)
{
return Task.FromException(e);
}   
}

学习一些 C# 中异步返回类型的最佳实践。

async的第一条规则是"除非你需要,否则不要使用它"。第二条规则是"从await开始,而不是async"。

所以这部分问题是不正确的:

问题在这里等待什么?

与其从async开始并尝试"使代码异步",不如从另一端开始:首先确定什么是自然异步的(即,你应该await什么(。使代码异步之前,您需要await一些事情。

如果您有自然异步的工作要做,则应使用await。这通常是基于 I/O 的,因此,如果您要调用 API 或执行数据库查询,则可以异步进行。确定低级别 I/O 调用后,更改方法以调用该 API 的异步版本,并添加await。编译器将从那里指导您,更改包含要asyncawait的方法,并将其返回类型从void更改为Task或将T更改为Task<T>。然后让async/await通过你的代码库自然增长。

如果您没有任何要等待的异步操作,则可以将该方法设置为普通的同步方法。如果要使方法异步,则最好以以异步结尾的方式命名该方法,例如OnConnectedAsync。

通常,当您有任何 I/O 操作(如文件访问、Web 下载/上传(可以独立于程序逻辑完成时,您使用 async/await 方法。简单地说,控制流是这样的,

  1. 主线程调用异步方法来触发 I/O 操作
  2. 遇到 await 后,控制权将返回到主线程;通常分配另一个线程来执行 async 方法的剩余语句。
  3. 主线程继续执行其语句,直到需要 I/O 操作的结果
  4. 主线程通过调用任务的任何等待或 GetResult 方法来等待异步方法的结果(即 I/O 操作的结果(
  5. 一旦主线程得到结果,它就会继续执行其语句

您可以在 async/await 上浏览 youtube 上的大量教程视频。

最新更新