Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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# 有没有办法从进程线程切换回退出时最初创建进程的线程?_C#_Multithreading_Mono - Fatal编程技术网

C# 有没有办法从进程线程切换回退出时最初创建进程的线程?

C# 有没有办法从进程线程切换回退出时最初创建进程的线程?,c#,multithreading,mono,C#,Multithreading,Mono,我的问题基本上是: 我在主线程中,创建一个进程并启动它。 我了解了如何从进程中获取异步事件。 当进程退出时,回调仍然在进程的线程中,但我需要在主线程中执行一些其他操作。 如果有人想知道为什么是静态的,为什么需要所有这些,这是因为我在游戏引擎上,需要一个静态方法来执行菜单项中的代码。菜单项需要从命令行util生成资产,然后使Unity刷新其资产目录以查找新资产。问题是,任何对Unity代码的调用都需要在主线程中执行,而当我开始获取进程回调时,我就不再在主线程中了 为了以防万一,我正在使用Mono

我的问题基本上是:

我在主线程中,创建一个进程并启动它。 我了解了如何从进程中获取异步事件。 当进程退出时,回调仍然在进程的线程中,但我需要在主线程中执行一些其他操作。 如果有人想知道为什么是静态的,为什么需要所有这些,这是因为我在游戏引擎上,需要一个静态方法来执行菜单项中的代码。菜单项需要从命令行util生成资产,然后使Unity刷新其资产目录以查找新资产。问题是,任何对Unity代码的调用都需要在主线程中执行,而当我开始获取进程回调时,我就不再在主线程中了


为了以防万一,我正在使用Mono for Unity,这是一种近似。NET 3.5,没有特定于Windows的内容。例如,System.Windows中的Dispatcher类不可用。

确定吗?似乎没有。我试着把我在主线程上运行的代码放在那里,Unity抱怨说代码需要在主线程上运行..不..那只是一个假设。很明显,如果这不是您得到的错误,如果是这种情况,那么您需要使用Invoke或BeginInvoke将代码委托回主线程。这些都是来自Dispatcher类的,对吗?如果是这样的话,恐怕它们对我不起作用,因为我没有System.Windows命名空间。我用的是Mono for Unity,大约。NET 3.5,没有特定于Windows的内容。我会在我的问题中加上这一点。我想这会改变一些事情,unity3d网站上似乎已经有了关于这一点的信息,可能对你有用。
public class SomeClass {
  static void Method() {
    Process p = new Process();
    p.StartInfo.RedirectStandardError = true;
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.UseShellExecute = false;
    p.StartInfo.CreateNoWindow = true;
    p.StartInfo.FileName = "a command line util";
    p.StartInfo.Arguments = "some arguments";
    p.EnableRaisingEvents = true;

    p.OutputDataReceived += (sender, e) => { 
      Debug.Log(e.Data); 
    };

    p.ErrorDataReceived += (sender, e) => {
      Debug.Log(e.Data);  
    };

    Thread mainThread = Thread.CurrentThread;
    p.Exited += (sender, e) => {
      if (p.ExitCode == 0) {
        // Need to do something in the thread which originally created p.
       //  I even got mainThread from above, but don't know if I can 'switch' to it.
      }
    };

    p.Start();
    p.BeginOutputReadLine();
    p.BeginErrorReadLine();
  }