当我进行异步调用时,是不是有必要在 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)
 

 

如果我在 iosandroid 手机游戏中使用 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)?的主要内容,如果未能解决你的问题,请参考以下文章

在异步任务中快速返回 Firebase

nginx异步非阻塞理解

接口异步调用,接口耗时减少的可不是一点点

利用tornado使请求实现异步非阻塞

从同步异步阻塞非阻塞到5种IO模型

从同步异步阻塞非阻塞到5种IO模型