我使用以下代码并且可以正常工作,但是我不确定这是否是进行异步编程的最佳/建议方式。
例如,以下代码是否必要?或者我可以不编写此代码就调用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;
答案 0 :(得分:1)
基于NewUsername
返回void
的情况,它不支持等待,因此无需使其成为异步方法。
public void NewUsername()
{
UpdateUsername();
}
但是您需要确保int Count = 10
在异步任务完成之后执行,我们不能让NewUsername
返回void,否则await
不会有任何事情。
根据您的代码,我认为UpdateUsername
之后没有进一步的操作,因此不需要NewUsername
是async
方法
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种方法可以完成:
异步等待,即await
在被叫方完成后添加操作。这使调用者变得异步。
同步等待,这是对返回的Wait
值调用Task
方法,以阻止当前线程完成操作。不建议这样做,因为它会使异步调用变得毫无意义。
等待异步被调用方返回的Task
值或被调用方返回void
的值,除非等待被调用方完成,否则不要继续执行。