Вот альтернативный ответ, который просто выполняет обещания подряд, если только обещание не было отклонено, а затем остановлено. Это не использует 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);
Если вам нужен более тонкий контроль, чем запуск внешней программы, подумайте о IKVM - http://www.ikvm.net/ - который предоставляет способ запускать программы на Java в мире .NET.
Это то же самое, что запускать собственные файлы .EXE, только исполняемый файл, который вам нужно будет выполнить, - это сама JVM (java.exe).
Итак, внутри вашего вызова кода C #:
java.exe -jar nameofyourjavaprogram.jar
И все будет в порядке.
Если у вас нет Java-программы в библиотеке JAR, просто запустите JVM со всеми необходимыми параметрами.
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();
Будет ли он работать синхронно или асинхронно
Он будет работать асинхронно, если у вас достаточно ядер, в противном случае он будет работать независимо, но ваш поток должен будет переключить контекст, чтобы другая программа была запущена. В любом случае, вам не о чем беспокоиться.