如何修复ContinueWith方法中的“只能从主线程调用”

时间:2019-01-08 17:50:29

标签: firebase unity3d firebase-realtime-database .net-4.6

我在尝试在Task实例的ContinueWith方法内操纵GameObjects时遇到问题。 在我们在Unity 2018.2.2.2中切换到.NET 4.x之前,下面的代码运行良好。

我进行了很多搜索,发现(这是使用UnityThread的)一种变通方法,我找不到该代码不再起作用的原因,并且由于相同的模式被大量使用,我想知道我的项目是否真的没有其他解决方案。

FirebaseDatabaseManager.Instance.GetPrivateChatMessages(chatId)
    .ContinueWith(messagesTask =>
    {
        if (messagesTask.IsCompleted && messagesTask.Result != null && messagesTask.Result.Exists)
        {
            // Go over the dictionary in reverse.
            foreach (var message in messagesTask.Result.Children.OrderByDescending(x => x.Key))
            {
                Debug.Log("Message " + message.Key);

                // Insert the message as the first element.
                StartCoroutine(AddMessageItem(message));
            }
        }
    });

编辑:这是方法GetPrivateChatMessages

/// <summary>
/// Returns the private chats' messages or null if the database is not initialized.
/// </summary>
/// <returns></returns>
public Task<DataSnapshot> GetPrivateChatMessages(string chatId, int limit, string lastItemKey, long lastItemTimestamp)
{
    if (!Initialized) return null;

    return DatabaseRoot.Child("messages").Child(chatId).OrderByChild("timestamp").EndAt(lastItemTimestamp, lastItemKey).LimitToLast(limit).GetValueAsync();
}

在更新之前,该行StartCoroutine(AddMessageItem(message)); 过去工作正常,现在会引发异常

  

01-08 13:47:15.376 23882-24991 / com.fhacktions E / Unity:
  IsObjectMonoBehaviour只能从主线程调用。
  构造函数和字段初始值设定项将从   加载场景时加载线程。
  不要在   构造函数或字段初始化程序,而是将初始化代码移至   唤醒或启动功能。
  UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator)
  Fhacktions.c__AnonStorey2:<> m__0(Task`1)
  System.Threading.Tasks.Task:Execute()
  System.Threading.ExecutionContext:RunInternal(ExecutionContext,ContextCallback,Object,Boolean)
  System.Threading.ExecutionContext:Run(ExecutionContext,ContextCallback,对象,布尔值)
  System.Threading.Tasks.Task:ExecuteWithThreadLocal(Task&)
  System.Threading.Tasks.Task:ExecuteEntry(布尔)
  System.Threading.ThreadPoolWorkQueue:Dispatch()
  
  [/Users/builduser/buildslave/unity/build/Runtime/Scripting/ScriptingThreadAndSerializationSafeCheck.cpp第85行]
  (文件名:/Users/builduser/buildslave/unity/build/Runtime/Scripting/ScriptingThreadAndSerializationSafeCheck.cpp Li

EDIT :将TaskScheduler.FromCurrentSynchronizationContext()作为参数传递给ContinueWith方法解决了该问题,我猜默认的实现已更改,这在切换后导致了问题。谢谢。

0 个答案:

没有答案