【问题标题】:Async method with parameters crash C#带参数的异步方法崩溃 C#
【发布时间】:2020-09-18 10:16:49
【问题描述】:

我在 UnityFirebase 上为这个项目使用 C#,但我不确定这是一个框架问题,更像是 async-approach-trouble。

我有一个在我的 firebase 数据库 (Firestore) 上写入数据的方法,这是我的 Database 类中的方法:

public async void AsyncAddData()
{
  User newUser = new User()
  {
      isConfigured = false,
      tag = userName,
      accessToken = ""
  };
  DocumentReference docRef = db.Collection("users").Document(newUser.tag);

  await docRef.SetAsync(newUser);

  Debug.Log("Added new user " + newUser.tag);      
}

当从我的MainController 调用时,此方法完美运行,例如:Database.AsyncAddData()

麻烦从开始,而不是在异步方法中创建new User 变量,而是尝试从我的MainController 传递一个已经存在的User 变量,例如Database.AsyncAddData(this.currentUser),所以async 方法现在看起来像:

public async void AsyncAddData(User newUser)
{
  DocumentReference docRef = db.Collection("users").Document(newUser.tag);

  await docRef.SetAsync(newUser);

  Debug.Log("Added new user " + newUser.tag);      
}

此方法会使整个软件崩溃。经过一番试验后,我的想法是,将currentUser 之类的“同步”变量传递给异步方法是不可行的。我想是的,因为如果我这样做Database.AsyncAddData(new User() { tag = currentUserLoged.tag }),它会起作用。

所以现在我的问题是……

如何将外部变量传递给异步方法?

已阅读相关帖子和问题:

Async Await Issue for methods with parameters

Unity crashes on async programming with Firebase database

Async await best practices in asynchronous programming

【问题讨论】:

  • 问题 - 你为什么使用 async void 而不是 async Task?
  • async void 会将所有异常返回给主线程。因为 Unity 不支持它,所以它只会崩溃。在正常的应用程序中,它会在主线程的“随机”位置抛出异常。
  • 除非必须,否则不要使用 async void(例外:事件处理程序)。
  • @PhilS 老实说,因为这对我来说似乎很简单,如果我不想返回任何东西,就不要这样做。但是看看你所有的 cmets,我肯定会看看这种方法。
  • @TomaszJuszczak 是有道理的......所以问题不可能是由异步的东西引起的,只是我有一个错误,比如我的标签为空,并且异常崩溃了统一,对吗?

标签: c# firebase unity3d google-cloud-firestore async-await


【解决方案1】:

使用“Task”作为异步函数的返回类型。

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/async-return-types#void-return-type

Task 返回类型可防止通过“调用者”方法删除 newUser,直到异步结束:

  • 您从“调用者”方法调用 asyncmethod 和 newUser
  • await 暂停处理async 方法并开始处理“调用者”方法
  • newUser 在“调用者”方法结束时被清除
  • 然后await 结束,async 方法开始处理
  • 在这种情况下,'newUser' 为 null 并引发异常

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    相关资源
    最近更新 更多