当我进行异步调用时,是不是有必要在 iOS 和 Android 的 while 循环中使用 Thread.Sleep(1)?
Posted
技术标签:
【中文标题】当我进行异步调用时,是不是有必要在 iOS 和 Android 的 while 循环中使用 Thread.Sleep(1)?【英文标题】:Is it necessary to use Thread.Sleep(1) in a while loop on iOS and Android when I make an asynchronous call?当我进行异步调用时,是否有必要在 iOS 和 Android 的 while 循环中使用 Thread.Sleep(1)? 【发布时间】:2020-05-10 09:54:33 【问题描述】:当我进行异步调用时,是否有必要在 while 循环中使用 Thread.Sleep(1)?或者我可以只使用我的 while 循环而不使用 Thread.Sleep(1) 行:
while (_running == true)
如果我在 ios 或 android 手机游戏中使用 Thread.Sleep(1) 会有所不同吗?如果我不使用 Thread.Sleep(1),我的游戏会不会崩溃?
我的代码:
private static bool _running = false;
bool loggedin = false;
string PlayerDeviceId = "";
string PlayerPlayFabID = "";
private void RegisterGuestPlayFabAccount()
PlayerDeviceId = ReturnMobileID();
var requestIOS = new LoginWithIOSDeviceIDRequest DeviceId = PlayerDeviceId, CreateAccount = true ;
var loginTask = PlayFabClientAPI.LoginWithIOSDeviceIDAsync(requestIOS);
loginTask.ContinueWith(OnPlayFabRegisterGuestAccountComplete);
private void OnPlayFabRegisterGuestAccountComplete(Task<PlayFabResult<LoginResult>> task)
if (task.Result.Result != null)
_running = true;
GetPlayFabAccountInfo();
while (_running == true)
Thread.Sleep(1);
loggedin = true;
if (task.Result.Error != null)
OnPlayFabError(task.Result.Error);
private void GetPlayFabAccountInfo()
var request = new GetAccountInfoRequest ;
var loginTask = PlayFabClientAPI.GetAccountInfoAsync(request);
loginTask.ContinueWith(OnGetPlayFabAccountInfoComplete);
private void OnGetPlayFabAccountInfoComplete(Task<PlayFabResult<GetAccountInfoResult>> task)
if (task.Result.Result != null)
PlayerPlayFabID = task.Result.Result.AccountInfo.PlayFabId;
if (task.Result.Error != null)
OnPlayFabError(task.Result.Error);
_running = false;
【问题讨论】:
为什么不直接在 OnPlayFabRegisterGuestAccountComplete 中使用 ContinueWith 而不是忙着等待呢? 您的两种解决方案都会浪费大量 CPU 忙于等待异步操作完成,我认为这两种解决方案都是解决此问题的非常糟糕的解决方案。真正的问题是你还不知道如何在 C# 中使用异步编程。您应该阅读有关使用async
/await
关键字的内容,或者至少了解为什么您建议的解决方案不好。您可以更好地使用 ContinueWith,并避免忙等待循环
我应该如何在我的代码中使用 ContinueWith?我不知道如何在 OnPlayFabRegisterGuestAccountComplete 中使用 ContinueWith。如果我需要等待操作完成,ContinueWith 总是比 while 循环更好吗?
只需调用var task = PlayFabClientAPI.GetAccountInfoAsync()
而不是GetPlayFabAccountInfo();
。然后在你提供给ContinueWith
的函数中设置loggedin = true;
【参考方案1】:
一般来说,如果您在代码中使用任何类型的睡眠,可能会有更好的方法来做到这一点。
对于任何可能长时间运行的操作,您应该将它们放在异步任务中,并在完成时在前台处理它们。实际上,在 android 中,您必须对后台任务执行网络操作,否则会引发异常。
【讨论】:
以上是关于当我进行异步调用时,是不是有必要在 iOS 和 Android 的 while 循环中使用 Thread.Sleep(1)?的主要内容,如果未能解决你的问题,请参考以下文章