我为Java代码创建了一个exe,我试图在C#app中使用它。我正在使用它
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = false;
startInfo.UseShellExecute = false;
startInfo.FileName = "abc.exe";
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.Arguments = args;
try
{
// Start the process with the info we specified.
// Call WaitForExit and then the using statement will close.
using (Process exeProcess = Process.Start(startInfo))
{
exeProcess.WaitForExit();
}
}
catch (Exception ex)
{
// Log error.
MessageBox.Show(ex.Message);
}
在此之后我读了exe应该创建的文本文件。
System.IO.StreamReader file =
new System.IO.StreamReader(textFile);
但我在阅读文本文件时遇到异常,说"文件正由另一个进程使用。"
现在我确定除exe之外没有其他进程访问此文件。我还调用了WaitForExit()方法。但我仍然得到例外。有谁知道如何解决这个问题?
编辑: 我通过删除文本文件并再次运行代码再次测试了代码。我得到了异常FileNotFound.So似乎代码试图在exe完成编写之前读取文件。我怎么能强制读取文件只有在文件被exe发布后才会发生?
答案 0 :(得分:-2)
您正在使用WaitForExit调用阻止您的应用程序,因此阻止Windows处理UI事件。我建议将您的代码移动到另一种类似的方法
编辑:所以在运行abc或ebc之后你可能没有其他代码可能太快了。
class Program
{
private static bool eventHandled;
private static int elapsedTime;
static void Main(string[] inputArgs)
{
string args = string.Empty;
try
{
Process exeProcess = new Process();
exeProcess.StartInfo.CreateNoWindow = false;
exeProcess.StartInfo.UseShellExecute = false;
exeProcess.StartInfo.FileName = "abc.exe";
exeProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
exeProcess.StartInfo.Arguments = args;
exeProcess.EnableRaisingEvents = true;
exeProcess.Exited += OnProcessExited;
exeProcess.Start();
}
catch (Exception ex)
{
// Log error.
Console.WriteLine(ex.Message);
}
// Wait for Exited event, but not more than 30 seconds.
const int SLEEP_AMOUNT = 100;
while (!eventHandled)
{
elapsedTime += SLEEP_AMOUNT;
if (elapsedTime > 30000)
{
break;
}
Thread.Sleep(SLEEP_AMOUNT);
}
}
private static void OnProcessExited(object sender, EventArgs eventArgs)
{
// do your work here
eventHandled = true;
}
}