প্রস্থানটির অপেক্ষার সময় আমার প্রক্রিয়াটি ঝুলে থাকার কারণ কী হতে পারে?
এই কোডটিতে পাওয়ারশেল স্ক্রিপ্ট শুরু করতে হবে যা ভিতরে অনেকগুলি ক্রিয়া সম্পাদন করে যেমন এমএসবিল্ডের মাধ্যমে কোডের পুনরায় সংক্রমণের সূচনা করে, তবে সম্ভবত সমস্যাটি হ'ল এটি খুব বেশি আউটপুট উত্পন্ন করে এবং পাওয়ার শেল স্ক্রিপ্ট সঠিকভাবে কার্যকর হওয়ার পরেও প্রস্থান করার জন্য অপেক্ষা করতে গিয়ে এই কোডটি আটকে যায় probably
এটি ধরণের "অদ্ভুত" কারণ কখনও কখনও এই কোডটি সূক্ষ্মভাবে কাজ করে এবং কখনও কখনও এটি কেবল আটকে যায়।
কোডটি এখানে স্তব্ধ:
process.WaitForExit (ProcessTimeOutMiliseconds);
পাওয়ারসেল স্ক্রিপ্টটি 1-2 সেকেন্ডের মতো কার্যকর করে এর মধ্যে সময়সীমা 19 সেকেন্ড হয়।
public static (bool Success, string Logs) ExecuteScript(string path, int ProcessTimeOutMiliseconds, params string[] args)
{
StringBuilder output = new StringBuilder();
StringBuilder error = new StringBuilder();
using (var outputWaitHandle = new AutoResetEvent(false))
using (var errorWaitHandle = new AutoResetEvent(false))
{
try
{
using (var process = new Process())
{
process.StartInfo = new ProcessStartInfo
{
WindowStyle = ProcessWindowStyle.Hidden,
FileName = "powershell.exe",
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
Arguments = $"-ExecutionPolicy Bypass -File \"{path}\"",
WorkingDirectory = Path.GetDirectoryName(path)
};
if (args.Length > 0)
{
var arguments = string.Join(" ", args.Select(x => $"\"{x}\""));
process.StartInfo.Arguments += $" {arguments}";
}
output.AppendLine($"args:'{process.StartInfo.Arguments}'");
process.OutputDataReceived += (sender, e) =>
{
if (e.Data == null)
{
outputWaitHandle.Set();
}
else
{
output.AppendLine(e.Data);
}
};
process.ErrorDataReceived += (sender, e) =>
{
if (e.Data == null)
{
errorWaitHandle.Set();
}
else
{
error.AppendLine(e.Data);
}
};
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit(ProcessTimeOutMiliseconds);
var logs = output + Environment.NewLine + error;
return process.ExitCode == 0 ? (true, logs) : (false, logs);
}
}
finally
{
outputWaitHandle.WaitOne(ProcessTimeOutMiliseconds);
errorWaitHandle.WaitOne(ProcessTimeOutMiliseconds);
}
}
}
লিপি:
start-process $args[0] App.csproj -Wait -NoNewWindow
[string]$sourceDirectory = "\bin\Debug\*"
[int]$count = (dir $sourceDirectory | measure).Count;
If ($count -eq 0)
{
exit 1;
}
Else
{
exit 0;
}
কোথায়
$args[0] = "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\MSBuild.exe"
সম্পাদন করা
@ ইনজেনের সমাধানে আমি একটি ছোট মোড়ক যুক্ত করেছি যা এমএস বিল্ডে ফাঁসি কার্যকর করার চেষ্টা করে
public static void ExecuteScriptRx(string path, int processTimeOutMilliseconds, out string logs, out bool success, params string[] args)
{
var current = 0;
int attempts_count = 5;
bool _local_success = false;
string _local_logs = "";
while (attempts_count > 0 && _local_success == false)
{
Console.WriteLine($"Attempt: {++current}");
InternalExecuteScript(path, processTimeOutMilliseconds, out _local_logs, out _local_success, args);
attempts_count--;
}
success = _local_success;
logs = _local_logs;
}
InternalExecuteScriptইনজেনের কোডটি কোথায়
Rxপদ্ধতিটি কাজ করেছে (যেমন এটি শেষ হয়নি) এমনকি বিপথগামী এমএসবিল্ড প্রক্রিয়াটি অনির্দিষ্ট সময়ের জন্য অপেক্ষা করার জন্য দাঁড়িয়ে আছে? কীভাবে পরিচালনা করা হয়েছিল তা জানতে আগ্রহী