我对异步编程有一些疑问

时间:2019-05-30 07:50:06

标签: c# xamarin

我使用以下代码并且可以正常工作,但是我不确定这是否是进行异步编程的最佳/建议方式。

例如,以下代码是否必要?或者我可以不编写此代码就调用UpdateUsername()吗?

 NewUsername();

 public async void NewUsername()
 {
   await UpdateUsername();
 }

我在代码中两次使用了“等待”,是否需要两次使用?

是否总是需要在带有异步标记的某些代码之前使用“等待”,例如“ PlayFabClientAPI.UpdateUserTitleDisplayNameAsync”之前的“等待”?

 private async Task UpdateUsername()
 {
   var resultupdatee = await PlayFabClientAPI.UpdateUserTitleDisplayNameAsync(new UpdateUserTitleDisplayNameRequest()
   {
     DisplayName = "NewName"
   });

   if (resultupdatee.Error != null)
   {
     // Handle error if any
     Console.WriteLine(resultupdatee.Error.GenerateErrorReport());
   }
   else
   {
     Console.WriteLine("User display name updated");
   }
 }

何时获得“ int Count = 10;”行。被执行?该行是否有可能在“等待PlayFabClientAPI.UpdateUserTitleDisplayNameAsync”完成之前被执行?

我想要“ int Count = 10;”仅在代码UpdateUsername()完成后才执行。

NewUsername();
int Count = 10;

1 个答案:

答案 0 :(得分:1)

基于NewUsername返回void的情况,它不支持等待,因此无需使其成为异步方法。

public void NewUsername()
{
    UpdateUsername();
}

但是您需要确保int Count = 10在异步任务完成之后执行,我们不能让NewUsername返回void,否则await不会有任何事情。

根据您的代码,我认为UpdateUsername之后没有进一步的操作,因此不需要NewUsernameasync方法

public Task NewUsername()
{
    return UpdateUsername();
}

但是如果有的话,您需要

public async Task NewUsername()
{
    await UpdateUsername();
    //Operations after UpdateUsername is done.
}

只要NewUsername返回Task,您就可以使用await确保int Count = 10;在完成所有操作后执行。

//Must be in an async function
await NewUsername();
int Count = 10;

如您所见,如果在另一个异步函数B完成之后函数A中需要执行某些操作,则函数A需要是异步的。换句话说,异步函数是可传递的。异步被调用方使调用方异步,除非您无需确保执行顺序或阻塞线程以同步等待。

结论,调用异步函数后有3种方法可以完成:

  1. 异步等待,即await在被叫方完成后添加操作。这使调用者变得异步。

  2. 同步等待,这是对返回的Wait值调用Task方法,以阻止当前线程完成操作。不建议这样做,因为它会使异步调用变得毫无意义。

  3. 等待异步被调用方返回的Task值或被调用方返回void的值,除非等待被调用方完成,否则不要继续执行。

    < / li>