因此,我已经与这个问题斗争了一段时间,并尝试了许多不同的方法来解决它,但都无法解决。
基本上,我的应用程序所做的就是调用一个java文件来将应用程序加载到设备上。在加载时,将其打印到富文本框中,然后我想转到下一个文件。我遇到的问题是,当第一个文件被加载时,第二个文件试图加载哪些情况下会出现问题。我已经尝试了等待退出,但是如果我这样做了,那么输出数据就不会写入富文本框中。有什么想法吗?
private void btnLoad_Click(object sender, EventArgs e)
{
rchsdtOut.Clear();
//count the items in queue.
var count = lstBarToLoad.Items.Count;
if (count <= 0)
{
MessageBox.Show("Nothing added to the load queue");
}
else
{
String toLoad;
for (int i=0; i < count;i++)
{//START OF FOREACH
toLoad = lstBarToLoad.Items[i].Text;
//call load method.
loaddPB(toLoad);
}//end of for.
}//end of else.
}//end of private我试着把等待出口放在许多不同的地方,但它似乎不起作用。
//Method to load files on device.
private void loaddPB(string toLoad)
{
process1 = new System.Diagnostics.Process();
process1.StartInfo.UseShellExecute = false;
process1.StartInfo.RedirectStandardOutput = true;
process1.StartInfo.RedirectStandardError = true;
process1.StartInfo.CreateNoWindow = true;
process1.StartInfo.FileName = "java.exe ";
process1.StartInfo.Arguments = "-Xmx512M -jar";
process1.StartInfo.Arguments += toLoad;
try
{
process1.Start();
process1.OutputDataReceived += (s, a) => myMethod(a);
process1.BeginOutputReadLine();
process1.ErrorDataReceived += (s, a) => myErrorMethod(a);
process1.BeginErrorReadLine();
process1.WaitForExit();
}
catch
{
Console.WriteLine("error");
}
}下面的两个方法将stdout或error写入富文本字段。
//Method to do the logging.
private void myMethod(DataReceivedEventArgs e)
{
if (e.Data != null)
{
Action action = () => rchsdtOut.Text += "\r\n" + e.Data.ToString();
rchsdtOut.BeginInvoke(action, null);
Console.WriteLine(e.Data.ToString());
}
}//end of private
//Method to load the error if any thrown.
private void myErrorMethod(DataReceivedEventArgs e)
{
if (e.Data != null)
{
Action action = () => rchsdtOut.Text += "\r\n" + e.Data.ToString();
rchsdtOut.BeginInvoke(action, null);
Console.WriteLine(e.Data.ToString());
}
}//end of private任何想法都是很棒的。基本上,我需要进程退出,这样我才能通过forloop继续加载下一个文件。
发布于 2012-02-09 23:31:10
如果使用WaitForExit,应用程序将阻塞(等待),直到进程退出。这意味着它无法在其UI线程中处理任何Windows消息,因此它不会更新UI。
你需要在后台启动这个过程,这样你的UI才能继续刷新。这可以通过以下方式完成:
while (!process.HasExited) { Application.DoEvents();Thread.Sleep(100);}
发布于 2012-02-09 23:30:47
我可能完全错了,但是...
process1.StartInfo.Arguments = "-Xmx512M -jar";
process1.StartInfo.Arguments += toLoad;您需要在-jar之后执行have a space
否则Java会立即崩溃。
发布于 2012-02-09 23:37:31
正在尝试将WaitForExit调用移出UI线程。
正如@M. Babcock提到的,您正在阻止对富文本框的更新。
类似这样的解决方案可能会起作用:
修改btnLoad_Click以启动一个处理列表的新线程(位于count >0分支中)
Thread thread = new Thread(new ThreadStart(LoadPbThread));
thread.Start();然后,添加以下内容:
void LoadPbThread()
{
String toLoad;
for (int i=0; i < count;i++)
{//START OF FOREACH
toLoad = lstBarToLoad.Items[i].Text;
//call load method.
loaddPB(toLoad);
}//end of for.
}https://stackoverflow.com/questions/9213569
复制相似问题