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