Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Unity中不使用协程在主线程上运行函数_C#_Multithreading_Unity3d_Mono - Fatal编程技术网

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提供您自己的答案,因为您有不同的函数调用。