从其他异步函数中调用非异步函数时,公认的最佳实践是什么?

你好

似乎在 Blazor 服务器应用程序中,我们鼓励尽可能使用 Async,我通常理解为什么。就是说-有人能不能解释一下使用异步函数时的一般期望并为我填写一些缺失的知识-我对那里的所有信息感到困惑,需要一些特定于我正在做的事情的信息,以帮我理解。

我试图在可能的情况下坚持使用 async 并且在大多数情况下这样做相当容易,但是在调用某些函数时,使它们异步似乎有点过分(或者是吗?)。在下面的示例中 - 从异步函数中调用非异步“ValidateEvent”函数。

所以我的问题是......我应该:

a)从异步函数中正常调用它(这似乎破坏了异步点)例如:“var validationResult = ValidateEvent(objDto);”?

b)使用 Task.Run 调用它,例如:“await Task.Run(() =>ValidateEvent(objDto));”?

c)将这个简单的 IF/ELSE 方法转换为 Async 函数?

提前感谢您的任何帮助/建议。

//example async function, that itself calls the other non-async function.
public async Task<Response> AddAsync(ObjDto objDto)
{
  // a) Call it normally?
  var validationResult = ValidateEvent(objDto);

  // b) Calling it using Task.Run?
  var validationResult = await Task.Run(() =>ValidateEvent(objDto));


  //Do stuff asynchronously here
  ...
  await _db.AddAsync(objDto);
  await _db.SaveChangesAsync();
  ...
}

验证函数:

c) 我真的应该将其转换为异步,因为它只是一系列“IF 和 ELSE”(下面进一步进行异步转换)

//Non-Async version
public ResponseObj ValidateEvent(ObjDto obj)
 {
   ResponseObj responseObj = new();
   string stringErrors = "";

   //If not full day, check that end date is not before start date
   if (!obj.IsFullDay)
   {
     if (obj.EndTime < obj.StartTime)
     stringErrors += ("End date cannot be before the start date<br />");
   }
   ...other code removed for brevity
   if (string.IsNullOrEmpty(stringErrors)) //Success
   {
     responseObj.Status = responseObj.Success;
   }
   else //errors
  {
    responseObj.Status = responseObj.Error;
    responseObj.Message = stringErrors;
  }

  return responseObj;
 }

// 异步转换示例 - 是否值得使用 Task.Run 进行转换?

//Async conversion
public async Task<ResponseObj> ValidateEvent(ObjDto obj)
{
    ResponseObj responseObj = new();
    string stringErrors = "";
    
   await Task.Run(() =>
       {
           //If not full day, check that end date is not before start date
           if (!obj.IsFullDay)
           {
               if (obj.EndTime < obj.StartTime)
                   stringErrors += ("End date cannot be before the start date<br />");
           }

           if (string.IsNullOrEmpty(stringErrors)) //Success
           {
               responseObj.Status = responseObj.Success;
           }
           else //errors
           {
               responseObj.Status = responseObj.Error;
               responseObj.Message = stringErrors;
           }

       }
   );
   return responseObj;
}

再次,提前感谢您在理解一般情况下的最佳方式方面的任何帮助/建议。

亨克·霍尔特曼

a) 从 Async 函数中正常调用它...

是的

...(这似乎打败了异步点)

不,它没有。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Kephas中调用异步函数时,PreserveThreadContext()是什么?

通过在C#中的非异步构造函数中调用在其他页面上触发异步函数

如何在非异步函数中调用异步函数

在非异步函数内部调用异步函数

函数调用未在 angular 的其他异步函数内发生

在应用程序启动后调用异步方法的最佳模式是什么?(构造函数中的 Fire&Forget?)

在另一个内部调用一个异步函数的最佳方法是什么?

是什么使JavaScript函数异步?

来自其他类异步的Java调用函数

创建异步迭代器的最佳实践是什么?我应该使用异步生成器函数还是使用Symbol.asyncIterator?

Fortran 函数返回数组时的最佳实践是什么?

非异步函数中的 AsyncStorage

在JavaScript中构造构造函数的最佳实践是什么?

防止Python中的函数重复的最佳实践是什么?

在地图中调用异步函数的最佳方法?

异步调用函数的最佳方式

在Java中的异步函数调用

在React-Native中的非异步函数内部调用异步函数-Firebase

c# - 如何在c#中的非异步函数中使用await调用异步函数?

为什么一个函数在调用另一个异步函数时是异步的?

管理缓存的异步数据的最佳实践/好的模式是什么?

使用异步而不等待的最佳实践是什么?

如果我在非异步函数中调用 `AsyncStorage.setItem` 而没有 await 会发生什么?

为什么仅调用同步函数时javascript promises异步?

仅具有同步内容的异步函数的最佳实践?

未定义为异步安全的函数(例如mmap(2))会影响信号处理程序中调用的其他异步安全函数吗?

从同步函数中调用异步函数

在普通函数中调用异步函数

在主函数中调用异步函数