Метод объекта Com блокируется в ядре asp.net, но не в модульных тестах - PullRequest
0 голосов
/ 20 мая 2018

У меня есть класс, который я использовал, чтобы обернуть com-объект (MLApp), который используется для вызова в matlab.У меня есть модульный тест, который инициализирует 5 сеансов Matlab и запускает команду, которая делает паузу на 10 секунд в каждом отдельном сеансе.Мой модульный тест занимает ~ 10 секунд, что и ожидается, поскольку они должны выполняться параллельно.

[Test]
public void ParallelExecution()
{
    List<MatlabRunner> runners = new List<MatlabRunner>();
    for (int i = 0; i < 5; i++)
    {
        runners.Add(new MatlabRunner());
    }

    try
    {
        List<Task<string>> t = new List<Task<string>>();
        foreach (MatlabRunner r in runners)
             t.Add(Task.Run<string>(()=>r.Execute( "pause(10)" )));

        Task<string>.WaitAll(t.ToArray());

        t.ForEach((task) => System.Console.WriteLine(task.Result));

    }
    finally
    {
        runners.ForEach((r)=>r.Quit());
    }
}

Однако теперь, когда я добавляю то же самое в мой основной проект asp.net, яможет сделать два веб-запроса, и они оба получены параллельно (я знаю это, потому что я регистрирую, что запрос получен), но затем вызывается runner.Execute ().

[HttpGet("Verify")]
public JsonResult Verify(String lot = null,String lotStatus = null,int? NumPorts = null,int? wafer = null)
{
    System.IO.File.AppendAllText(@"C:\Logs\log.txt", "\n\Received Request! " + System.DateTime.Now + "\n");

    String command = "pause(10)";
    MatlabRunner runner = null;
    String result = "";
    try
    {
      runner = new MatlabRunner();
        result = runner.Execute(command);
    }
    catch(Exception e)
    {
        System.IO.File.AppendAllText(@"C:\Logs\log.txt", e.StackTrace + " " + e.InnerException + " " + e.GetType() + e.Source + " " + e.GetBaseException());
    }
    finally
    {
        runner.Quit();
        System.IO.File.AppendAllText(@"C:\Logs\log.txt", "\nQuit! " + System.DateTime.Now + "\n");
    }
    return new JsonResult(result);
}

Проблема заключается вчто я делаю два параллельных запроса GET к этому методу Verify.Пока один запрос вызывает runner.Execute("pause(10)"), другой запрос заблокирован от вызова этого метода.Я ожидал бы сделать два вызова к этому методу Verify параллельно, и они оба будут выполняться параллельно, в общей сложности ~ 10 секунд.Однако для выполнения обоих запросов требуется 20 секунд (10 для первого, 10 для второго).В моем модульном тесте я вызываю этот же метод параллельно, используя Задачи, и весь модульный тест выполняется за 10 секунд, несмотря на запуск 5 бегунов.Если бы я сделал то же самое в веб-сервисе, это заняло бы 50 секунд.Надеюсь, этого достаточно.Я могу прикрепить журнал с отметками времени, чтобы показать, как все выполняется, если это будет полезно.

Я что-то упускаю с точки зрения конфигурации в IIS?Потенциально что-то, когда я строю или публикую?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...