【问题标题】:Cannot call method to completion from under task.IsFaulted condition无法从 task.IsFaulted 条件下调用方法完成
【发布时间】:2019-06-22 13:56:41
【问题描述】:

我正在为我的 Unity 游戏实施 Firebase 身份验证。我试图在SignInWithEmailAndPasswordAsync 任务完成(我输入错误的电子邮件)并且IsFaultedtrue 后调用一种方法来显示错误。

我调用的这个方法是ErrorTest,它会创建一个字符串列表并调用DisplayError。但是DisplayError 方法不会运行完成。

Debug.Log ("Activating ErrorBox") 行将运行(因此DisplayError 开始执行)但其余的都没有执行,这意味着没有游戏对象激活或第二次debug.log 调用。

编辑器中没有关于此的错误。我在这里尝试了不同的东西,更改了某些组件的文本属性等。只有调试调用才会运行,直到游戏中的某些内容需要更改的第一行代码,并且该方法在那里停止执行。坚持这个重要时刻感谢任何帮助。

Errortest() 从 UI Button 调用时,DisplayError() 正常运行,它完成了它应该做的事情,所以我认为故障必须在异步任务位的某个地方。

public void ErrorTest () {    
    List<string> testList = new List<string> () {"doodle", "froodle"};
    DisplayError (testList);
}

public void DisplayError (List<string> displayErrorList) {    
     if (displayErrorList != null) {         
         Debug.Log ("Activating ErrorBox");
         errorBox.SetActive (true);
         Debug.Log ("Activated ErrorBox");
         foreach (string error in displayErrorList)
             errorText.text += error + "\n";

     } else {
         Debug.LogError ("Error list doesn't exist");
     }
}

public void SignInWithPassword () {

    string email = emailInput.text.Trim();
    string password = passwordInput.text.Trim();
    auth.SignInWithEmailAndPasswordAsync(email, password).ContinueWith(task => {
        if (task.IsCanceled) {
            Debug.LogError("SignInWithEmailAndPasswordAsync was canceled.");
            return;
        }        
        if (task.IsFaulted) {
            Debug.LogError("SignInWithEmailAndPasswordAsync encountered an error: " + task.Exception);
            ErrorTest ();             
            return;
        }
        FirebaseUser newUser = task.Result;
        Debug.LogFormat("User signed in successfully: {0} ({1})",
           newUser.DisplayName, newUser.UserId);

     });
 }

当输入错误的电子邮件时,调试日志将显示来自 lambda 表达式(任务异常)的调用,以及 DisplayError 方法的第一行。它停在那里。

“SignInWithEmailAndPasswordAsync 遇到错误:System.AggregateException:发生一个或多个错误。---> System.AggregateException:发生一个或多个错误。---> Firebase.FirebaseException:电子邮件地址格式错误。”

“激活错误框”

【问题讨论】:

  • 很可能遇到了死锁。考虑使用异步事件处理程序。
  • 错误消息显示“电子邮件地址格式错误”,因此您似乎在那里传递了不正确的值。在这种情况下,我通常会尝试使用硬编码值重现问题,例如auth.SignInWithEmailAndPasswordAsync("me@my.com", "correcthorsebatterystaple")。如果可行,您就知道问题在于如何从输入中获取值。如果您对硬编码值有同样的问题,请更新您的问题以显示这些问题,因为这样我们可以更轻松地重现您遇到的问题。
  • @FrankvanPuffelen 我可能没有很好地澄清,我故意输入错误的电子邮件来测试向用户显示错误消息。我有一个单独的方法,它采用 AggregateException 并生成一个 List 并将其输入 DisplayError,我没有包含它,因为该问题可以通过更简单的 ErrorTest () 方法重现。我无法显示错误框,因为 displayerror 无法正常运行。

标签: c# unity3d exception firebase-authentication task


【解决方案1】:

找到答案。 Unity API 显然只能在主线程上执行,因此在任务完成后,您必须将事件分派到主线程并在那里排队。

这位先生制作了一个主线程调度程序,因此使用它并且它可以工作:

https://github.com/PimDeWitte/UnityMainThreadDispatcher

【讨论】:

    猜你喜欢
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多