Как выполнить программу Java от C#?

Вот альтернативный ответ, который просто выполняет обещания подряд, если только обещание не было отклонено, а затем остановлено. Это не использует await, но должно дать вам общее представление о том, как это можно сделать без него, но этот код также был написан очень быстро, поэтому он не самый оптимизированный код.

const x = function() {
  return new Promise(resolve => {
    resolve('it resolved ma!');
  });
};

const y = function() {
  const self = this;
  return new Promise((resolve, reject) => {
    reject("reject");
  });
};

const z = function() {
  const self = this;
  return new Promise((resolve, reject) => {
    resolve("never gets executed");
  });
};

function runPromises(promises) {
  const results = [];
  let count = 0;
  const executePromise = i => {
    count++;
    return promises[i]()
      .then((response) => {
        results.push(response);
        if (count !== promises.length) {
          executePromise(count);
        }
      })
      .catch((e) => {
        results.push(e);
        console.log("stop right now, thank you very much");
      });
  };
  if (Array.isArray(promises)) {
    executePromise(count);
  }
  return results;
}

const results = runPromises([x, y, z]);
console.log(results);

22
задан 7wp 17 May 2009 в 02:51
поделиться

4 ответа

Если вам нужен более тонкий контроль, чем запуск внешней программы, подумайте о IKVM - http://www.ikvm.net/ - который предоставляет способ запускать программы на Java в мире .NET.

16
ответ дан 29 November 2019 в 03:51
поделиться

Это то же самое, что запускать собственные файлы .EXE, только исполняемый файл, который вам нужно будет выполнить, - это сама JVM (java.exe).

Итак, внутри вашего вызова кода C #:

java.exe -jar nameofyourjavaprogram.jar

И все будет в порядке.

Если у вас нет Java-программы в библиотеке JAR, просто запустите JVM со всеми необходимыми параметрами.

11
ответ дан 29 November 2019 в 03:51
поделиться
var processInfo = new ProcessStartInfo("java.exe", "-jar app.jar")
                      {
                          CreateNoWindow = true,
                          UseShellExecute = false
                      };
Process proc;

if ((proc = Process.Start(processInfo)) == null)
{
    throw new InvalidOperationException("??");
}

proc.WaitForExit();
int exitCode = proc.ExitCode;
proc.Close();
22
ответ дан 29 November 2019 в 03:51
поделиться

Будет ли он работать синхронно или асинхронно

Он будет работать асинхронно, если у вас достаточно ядер, в противном случае он будет работать независимо, но ваш поток должен будет переключить контекст, чтобы другая программа была запущена. В любом случае, вам не о чем беспокоиться.

2
ответ дан 29 November 2019 в 03:51
поделиться