我在尝试在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方法解决了该问题,我猜默认的实现已更改,这在切换后导致了问题。谢谢。