C# 从.net多次调用matlab

C# 从.net多次调用matlab,c#,.net,matlab,C#,.net,Matlab,似乎不可能多次调用matlab: [STAThread] static void Main(string[] args) { IList<DTO> LotsOfWork = new List<DTO>(); // create some work for(int c = 0; c < 10; c++) { LotsOfWork.Add(new DTO(){ Id = c, Parameter1 = c, Parameter2

似乎不可能多次调用matlab:

[STAThread]
static void Main(string[] args)
{
    IList<DTO> LotsOfWork = new List<DTO>();
    // create some work
    for(int c = 0; c < 10; c++)
    {
    LotsOfWork.Add(new DTO(){ Id = c, Parameter1 = c, Parameter2 = c });
    }

    // deal with work
    foreach (DTO DTO in LotsOfWork)
    {
    MLApp.MLApp matlab = new MLApp.MLApp();
    object result;

    matlab.Execute("clear;");
    matlab.PutWorkspaceData("a", "base", DTO.Parameter1);
    matlab.PutWorkspaceData("b", "base", DTO.Parameter2);
    matlab.Execute("result = a + b;");
    matlab.GetWorkspaceData("result", "base", out result);
    }
}

public class DTO
{
    public int Id { get; set; }
    public double Parameter1 { get; set; }
    public double Parameter2 { get; set; }
    public string Result { get; set; }
}
我还想知道是否有可能运行类似于“线程化”的东西(即为每个DTO对象生成一个线程)。谢谢。

解决方案。替换:

object result;
与:

这是Mathworks的回复:

导致此错误的原因是GetWorkspaceData预期输出参数为空变量,但在运行循环一次后,结果实际上变成了值为0.0的双精度值。因此,您需要将循环更改为:

foreach (DTO DTO in LotsOfWork)
{

    object result = null; //Initialize as null

    matlab.Execute("clear;");
    matlab.PutWorkspaceData("a", "base", DTO.Parameter1);
    matlab.PutWorkspaceData("b", "base", DTO.Parameter2);
    matlab.Execute("result = a + b;");
    matlab.GetWorkspaceData("result", "base", out result);
}

@Felix K.我已经编辑了答案。如果你能重新考虑你的否决票,我将不胜感激。@Felix K.我知道你的意思,但你自己去检查一下。如果删除“=null”(将断点设置为:matlab.Execute(“clear;”;)),则第一次迭代后局部变量结果不为null。1+正确,您是正确的。这让我大吃一惊,因为我一直认为当它在循环上下文中声明时将为null。似乎我从来没有经历过一个错误,它是由循环中的对象缺少初始化引起的。谢谢。是的,很奇怪。我相信这更像是一个.Net问题,但还有其他一些奇怪的matlab怪癖:
object result = null;
foreach (DTO DTO in LotsOfWork)
{

    object result = null; //Initialize as null

    matlab.Execute("clear;");
    matlab.PutWorkspaceData("a", "base", DTO.Parameter1);
    matlab.PutWorkspaceData("b", "base", DTO.Parameter2);
    matlab.Execute("result = a + b;");
    matlab.GetWorkspaceData("result", "base", out result);
}