C# 任务与异步有什么关系?

C# 任务与异步有什么关系?,c#,model-view-controller,webapi,C#,Model View Controller,Webapi,如果在异步方法中不使用Task怎么办?我搜索了很多,但能够理解为什么我们使用Task和async。请提出一些建议,因为两者都是异步的,请提前感谢 异步任务签名示例: //Controller with async and task public async Task<IActionResult> CreateNewBug([FromBody] BugTrackerRequest bugTrackerRequest) { if (ModelState.IsValid) {

如果在异步方法中不使用Task怎么办?我搜索了很多,但能够理解为什么我们使用
Task
async
。请提出一些建议,因为两者都是异步的,请提前感谢

异步
任务
签名示例:

//Controller with async and task 
public async Task<IActionResult> CreateNewBug([FromBody] BugTrackerRequest bugTrackerRequest)
{
   if (ModelState.IsValid)
   {
        var Request = await _projectDetails.CreateNewBug(bugTrackerRequest);
        if (Request > 0)
        {
           return Ok("Success");
        }
    }

   return StatusCode(500, new { Message = "Something went wrong" });
}
//具有异步和任务的控制器
公共异步任务CreateNewBug([FromBody]BugTrackerRequest BugTrackerRequest)
{
if(ModelState.IsValid)
{
var Request=wait_projectDetails.CreateNewBug(bugTrackerRequest);
如果(请求>0)
{
返回Ok(“成功”);
}
}
返回状态码(500,新的{Message=“Something gours error”});
}
如果在异步方法中不使用Task怎么办

嗯,这是故意的

如果要使用
async
,则有一组有效返回类型*:

  • void
  • 任务
  • 任务
  • 任务类类型
  • IAsyncEnumerable
  • IAsyncEnumerator
*这里不考虑lambda和anonomyous的方法

其他任何东西都是无效的。而
void
被认为是不好的做法

例如:

将导致此错误:

错误CS1983异步方法的返回类型必须为void、Task、Task、类任务类型、iasyncnumerable或iasyncnumerator

另外,
async
修饰符本身也做不了很多事情。我相信这是一个普遍的误解

它不会使您的代码“异步”它是任务与
await
关键字的组合,它允许您异步执行任务,但随后以后续方式继续执行任务-这就是
async/await
构造的目的

我强烈建议您阅读Cleary先生关于该主题的博客:

正如他所说:

“async”关键字在该方法中启用“await”关键字,并更改处理方法结果的方式。这就是async关键字所做的一切!它不会在线程池线程上运行此方法,也不会执行任何其他类型的操作。async关键字仅启用await关键字(并管理方法结果)


如注释所示:如果要使用wait,则只需要异步。只有在异步方法之后需要执行某些操作时,才使用wait

另外:任务可能是异步的,但不一定是异步的。为了简单起见,让我们在以下示例中假设它们是:

一些例子:

// no async, yet possibly asynchronous.
// Task can be returned directly, it's still asynchronous.
public Task<int> ProcessData()
{
   return _dbContext.SaveChangesAsync();
}
//没有异步,但可能是异步的。
//任务可以直接返回,它仍然是异步的。
公共任务ProcessData()
{
返回_dbContext.SaveChangesAsync();
}
//没有异步,但可能是异步的。
//直接返回任务
公共异步任务ProcessData()
{
var result=await_dbContext.SaveChangesAsync();
//如果要在任务完成后继续此处,请等待所需。
如果(结果<1)
抛出新的ValidationException(“应高于1”);
返回结果;
}
以下两个示例没有添加任何内容和/或无效:

// returning the task directly
public Task<int> ProcessData()
{
   //ERROR: missing async keyword
   var result = await _dbContext.SaveChangesAsync(); 
   return result;   
}
//直接返回任务
公共任务ProcessData()
{
//错误:缺少async关键字
var result=await_dbContext.SaveChangesAsync();
返回结果;
}
//直接返回任务
public async Task ProcessData()//警告:缺少wait关键字
{
//警告:缺少等待关键字
返回_dbContext.SaveChangesAsync();
}
如果在异步方法中不使用Task怎么办

嗯,这是故意的

如果要使用
async
,则有一组有效返回类型*:

  • void
  • 任务
  • 任务
  • 任务类类型
  • IAsyncEnumerable
  • IAsyncEnumerator
*这里不考虑lambda和anonomyous的方法

其他任何东西都是无效的。而
void
被认为是不好的做法

例如:

将导致此错误:

错误CS1983异步方法的返回类型必须为void、Task、Task、类任务类型、iasyncnumerable或iasyncnumerator

另外,
async
修饰符本身也做不了很多事情。我相信这是一个普遍的误解

它不会使您的代码“异步”它是任务与
await
关键字的组合,它允许您异步执行任务,但随后以后续方式继续执行任务-这就是
async/await
构造的目的

我强烈建议您阅读Cleary先生关于该主题的博客:

正如他所说:

“async”关键字在该方法中启用“await”关键字,并更改处理方法结果的方式。这就是async关键字所做的一切!它不会在线程池线程上运行此方法,也不会执行任何其他类型的操作。async关键字仅启用await关键字(并管理方法结果)


如注释所示:如果要使用wait,则只需要异步。只有在异步方法之后需要执行某些操作时,才使用wait

另外:任务可能是异步的,但不一定是异步的。为了简单起见,让我们在以下示例中假设它们是:

一些例子:

// no async, yet possibly asynchronous.
// Task can be returned directly, it's still asynchronous.
public Task<int> ProcessData()
{
   return _dbContext.SaveChangesAsync();
}
//没有异步,但可能是异步的。
//任务可以直接返回,它仍然是异步的。
公共任务ProcessData()
{
返回_dbContext.SaveChangesAsync();
}
//没有异步,但可能是异步的。
//直接返回任务
公共异步任务ProcessData()
{
var result=await_dbContext.SaveChangesAsync();
//如果要在任务完成后继续此处,请等待所需。
如果(结果<1)
抛出新的ValidationException(“应高于1”);
返回结果;
}
fol
// returning the task directly
public Task<int> ProcessData()
{
   //ERROR: missing async keyword
   var result = await _dbContext.SaveChangesAsync(); 
   return result;   
}
// returning the task directly
public async Task<int> ProcessData() //WARNING: missing await keyword
{
   //WARNING: missing await keyword
   return _dbContext.SaveChangesAsync(); 
}