c# - 如何在不链接的情况下从 .NET 使用命令行 Matlab?

标签 c# .net matlab process filesystemwatcher

我终于发现了一种无需链接即可从 .NET 使用命令行 Matlab 的方法:

  1. 使用 David A. Zier 的“csmatio”dll 将变量从 .NET 写入 MAT 文件。

  2. 从 Matlab 中读取文件,对其进行处理并将结果保存到 MAT 文件中:

    var process = new Process()
    {
        StartInfo = new ProcessStartInfo()
        {
            FileName = MatlabExecutableFileName,
            Arguments = "-nodisplay " + 
               "-nojvm " +
               " -r \"somecommands; " + 
               "save FILENAME OUTPUTVARIABLES; " +
               "exit;\""
        }
    };
    process.Start();
    
  3. 最糟糕的部分:WAITING过程完成。

    天真的方法:

    process.WaitForExit();
    

    不起作用,因为 matlab 在新线程中生成主应用程序

    观察输出文件的变化是棘手的:

    new FileSystemWatcher(MatlabPath, fileName)
        .WaitForChanged(WatcherChangeTypes.All)
    

    因为这个类的错误而无法工作。

    当前工作代码更长:

    using (var watcher = new FileSystemWatcher(MatlabPath, fileName))
    {
        var wait = new EventWaitHandle(false, EventResetMode.AutoReset);
        watcher.EnableRaisingEvents = true;
        watcher.Changed += delegate(object sender, FileSystemEventArgs e)
        {
           wait.Set();
        };
        foreach(var i in Enumerable.Range(0, 2))
        {
            if (!wait.WaitOne(MillissecondsTimeout))
            {
                throw new TimeoutException();
            }
        }
        Thread.Sleep(1000);
    }
    

    但我担心最后一行代码。上面的代码块是为了避免它而写的,但我不知道还能做什么。这段时间在某些计算机上会太多,而在其他计算机上会太少。

解决方案

var previousProcesses = Process
    .GetProcessesByName("Matlab")
    .Select(a => a.Id)
    .ToArray();
process.Start();
process.WaitForExit();
var currentProcess = Process
    .GetProcessesByName("Matlab")
    .Where(a => !previousProcesses.Contains(a.Id))
    .First();
currentProcess.WaitForExit();

最佳答案

更好的选择是 matlab 的 -wait 标志。它告诉 matlab 启动器与主 matlab 进程一起终止。

关于c# - 如何在不链接的情况下从 .NET 使用命令行 Matlab?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1115028/

相关文章:

c# - Java中具有int值的枚举

c# - 将字符串数组传递给 webservice 方法

c# - 在 Application 的部分子类中访问 Properties.Resources/Settings

matlab矩阵科学记数法

matlab - 如何将比特流分成数据包

c# - 在 UWP 中创建不同的构建

c# - 如何调用(非虚拟)虚拟方法的原始实现?

c# - 为什么当我单击滚动条时控制台会暂停我的代码

.net - 如何捆绑oracle数据访问dll?

matlab - 如何创建一个根据变化的分布进行选择的函数,而不需要一遍又一遍地传递?