C# 如何在Unity中不使用协程在主线程上运行函数
我遇到过一些关于使用协同程序在主线程上运行函数的文章,例如: 因为我想从套接字侦听器跳转到主线程,所以它对我的代码不起作用C# 如何在Unity中不使用协程在主线程上运行函数,c#,multithreading,unity3d,mono,C#,Multithreading,Unity3d,Mono,我遇到过一些关于使用协同程序在主线程上运行函数的文章,例如: 因为我想从套接字侦听器跳转到主线程,所以它对我的代码不起作用 SocketIOClient.Client socket; IEnumerator StartExamples() { socket.On("connect", (fn) => { WriteLine("\r\nConnected event...\r\n"); //Jump to main thread
SocketIOClient.Client socket;
IEnumerator StartExamples()
{
socket.On("connect", (fn) =>
{
WriteLine("\r\nConnected event...\r\n");
//Jump to main thread
yield return Ninja.JumpToUnity; //ERROR: couldn't do a yield return
Destroy(someGameObject);
//Jump back to background thread
yield return Ninja.JumpBack; //ERROR: couldn't do a yield return
});
}
那么我们有什么解决办法吗?我希望我能像这样跳转到主线程:
Dispatcher.BeginInvoke(() =>
{
//Unity API
Destroy(gameObject);
});
根据我的评论,使用
这不允许您在同一代码块内的线程之间跳转,但通过使用回调系统,您可以提醒主线程执行操作,而不会启动和产生混乱的协程。更好的外观和维护。根据我的评论,使用
这不允许您在同一代码块内的线程之间跳转,但通过使用回调系统,您可以提醒主线程执行操作,而不会启动和产生混乱的协程。更好的外观和维护。我最终使用了一个非常有用的扩展名为。这是免费的,足够满足我的需要了 这是用法:
UnityThreadHelper.Dispatcher.Dispatch(() =>
{
Destroy(a);
});
注意:Dispatcher是一个单例对象,它将在第一次调用时初始化。您必须在主线程上执行第一次调用,因为它使用一些Unity API
private void Start()
{
var ugly = UnityThreadHelper.Dispatcher;
}
希望这有帮助 我最后使用了一个非常有用的扩展名。这是免费的,足够满足我的需要了 这是用法:
UnityThreadHelper.Dispatcher.Dispatch(() =>
{
Destroy(a);
});
注意:Dispatcher是一个单例对象,它将在第一次调用时初始化。您必须在主线程上执行第一次调用,因为它使用一些Unity API
private void Start()
{
var ugly = UnityThreadHelper.Dispatcher;
}
希望这有帮助 socket.On(上)的第二个参数是一个函数,在这里您不能使用yield。也许您可以使用flag并启动一个类似StartExample的协程,然后等待与以下内容的连接:“while(flagNotReady){yield return null;}”这就是我的问题。我不想使用协同程序,因为我的代码中会有很多侦听器。标志和协同程序会使我的代码变得不干净,难以维护。你考虑过使用类似于承诺的东西吗?@AtraViator我刚在谷歌上搜索过,似乎更多的是关于回调处理或按顺序执行函数,非常好的扩展,顺便说一句。但我正在努力解决如何从当前线程跳转到UI线程(我上面的代码socket.On listener是在后台线程上运行的),因为Unity API只在主线程上运行。@FlySoFast在我以前的一个项目中,我们使用了uPromise。通过解析后台线程套接字连接操作中的承诺,并提供在承诺(在主线程上声明)的.Done()内执行的实际代码,然后您可以在UI线程上运行代码。这与同一代码块中的“跳转线程”不同,但它可以提供可维护的代码库,并且为我的项目提供了代码。如果您感兴趣,我可以在下面提供一个真正的答案,并提供代码示例。socket.on的第二个参数(是一个函数,在那里您不能使用yield。也许您可以使用flag并启动一个类似StartExample的协程,然后等待与以下内容的连接:“while(flagNotReady){yield return null;}”这就是我的问题。我不想使用协同程序,因为我的代码中会有很多侦听器。标志和协同程序会使我的代码变得不干净,难以维护。你考虑过使用类似于承诺的东西吗?@AtraViator我刚在谷歌上搜索过,似乎更多的是关于回调处理或按顺序执行函数,非常好的扩展,顺便说一句。但我正在努力解决如何从当前线程跳转到UI线程(我上面的代码socket.On listener是在后台线程上运行的),因为Unity API只在主线程上运行。@FlySoFast在我以前的一个项目中,我们使用了uPromise。通过解析后台线程套接字连接操作中的承诺,并提供在承诺(在主线程上声明)的.Done()内执行的实际代码,然后您可以在UI线程上运行代码。这与同一代码块中的“跳转线程”不同,但它可以提供一个可维护的代码库,并且对我的项目有效。如果您感兴趣,我可以在下面提供一个真实的答案,并提供代码示例。@seaders请提供您自己的答案,因为您有不同的函数调用。@seaders请e提供您自己的答案,因为您有不同的函数调用。