具有Goroutine和C#异步/等待相同的效果

问题描述

如果进程在与应用服务器不同的CPU上继续运行,则使用async / await方法将非常有用。

例如,数据库查询在数据库服务器上运行,而在查询运行时无需阻塞应用程序线程。您可以从here进行检查。

让我们看看该c#代码块

 public async Task SaveAsync(User user)
    {
        using (DataContext ctx = new DataContext())
        {
            ctx.User.Add(user);
            // database does its job while we are waiting
            await ctx.SaveChangesAsync();
        }
    }

那么goroutine代码是否具有相同的作用?

func (u *User) Create(userModel *model.User) error {
var err error
var wg sync.WaitGroup
//or channel can be used for sync 
wg.Add(1)  //wg := make(chan int)


go func() {
    defer wg.Done(). //wg <- 1
    _,err = u.Transaction.User.
        Create().
        SetAge(userModel.Age).
        SetName(userModel.Name).
        SetIsDeleted(false).
        Save(u.Ctx)
   
}()

wg.Wait() //    <-wg
if err !=nil{
    return err
}
return nil}

解决方法

Goroutine和async / await是异步编程的不同方法。在后台,您有P个进程,M个CPU内核和G个协程。您的语言运行时将对它们进行操作-检查何时应停止运行(不从实际进程中调度,因此不应该调度到CPU内核),而其他应调度到内核中。

哪种方法更好?这取决于开发人员。至于我异步/等待有更多的语法糖,goroutines在编程方面更明确。因此,首先可以更简洁,其次-在诸如select {..}等复杂情况下更容易理解。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...