this.textBox1.Text=" "; 报错c#
异步处理,不知道怎么让textBox1.Text="";接受,报错,代码:privatevoidbutton3_Click(objectsender,EventArgse...
异步处理,不知道怎么让textBox1.Text=" ";接受,报错,代码:
private void button3_Click(object sender, EventArgs e)
{
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
//p.StartInfo = new ProcessStartInfo(@"C:\windows\system32\cmd.exe", "dir c:\\");
//p.StartInfo.Arguments = "dir c:\\";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;//可能接受来自调用程序的输入信息
p.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息
p.StartInfo.CreateNoWindow = true;//不显示程序窗口
p.EnableRaisingEvents = true;
//p.Start();//启动程序
//向CMD窗口发送输入信息:
//string cmd = @"C:\Dropbox\wp\all\ffutool.exe -flash " + @"C:\Dropbox\8916wp\wp8.ffu" + " -force";
//string cmd = @"C:\Dropbox\wp\all\ffutool.exe --list ";
//string cmd = "dir c:\\";
//p.StandardInput.WriteLine(cmd); //10秒后重启(C#中可不好做哦)
p.Start();
p.StandardInput.WriteLine("dir c:\\");
p.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived);
//StreamWriter sortStreamWriter = p.StandardInput;
// 异步获取命令行内容
p.BeginOutputReadLine();
// 为异步获取订阅事件
//sortStreamWriter.Close();
p.StandardInput.WriteLine("exit");
// Wait for the sort process to write the sorted text lines.
p.WaitForExit();
p.Close();
}
public delegate void OutputDataReceived(Object sender, DataReceivedEventArgs e);
void process_OutputDataReceived(Object sender, DataReceivedEventArgs e)
{
if (!String.IsNullOrEmpty(e.Data))
{
//numOutputLines++;
// Add the text to the collected output.
//sortOutput.Append(Environment.NewLine +
// "[" + numOutputLines.ToString() + "] - " + outLine.Data);
//this.textBox1.Text=" ";
//textBox1.AppendText(Environment.NewLine + e.Data.ToString());
MessageBox.Show(Environment.NewLine + e.Data.ToString());
//this.feedback.Text = e.Data.ToString() + Environment.NewLine + this.feedback.Text;
}
}
在process_OutputDataReceived方法中,不能访问textbox,报线程访问错误。那怎么才能向textbox里面写内容呢?? 展开
private void button3_Click(object sender, EventArgs e)
{
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
//p.StartInfo = new ProcessStartInfo(@"C:\windows\system32\cmd.exe", "dir c:\\");
//p.StartInfo.Arguments = "dir c:\\";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;//可能接受来自调用程序的输入信息
p.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息
p.StartInfo.CreateNoWindow = true;//不显示程序窗口
p.EnableRaisingEvents = true;
//p.Start();//启动程序
//向CMD窗口发送输入信息:
//string cmd = @"C:\Dropbox\wp\all\ffutool.exe -flash " + @"C:\Dropbox\8916wp\wp8.ffu" + " -force";
//string cmd = @"C:\Dropbox\wp\all\ffutool.exe --list ";
//string cmd = "dir c:\\";
//p.StandardInput.WriteLine(cmd); //10秒后重启(C#中可不好做哦)
p.Start();
p.StandardInput.WriteLine("dir c:\\");
p.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived);
//StreamWriter sortStreamWriter = p.StandardInput;
// 异步获取命令行内容
p.BeginOutputReadLine();
// 为异步获取订阅事件
//sortStreamWriter.Close();
p.StandardInput.WriteLine("exit");
// Wait for the sort process to write the sorted text lines.
p.WaitForExit();
p.Close();
}
public delegate void OutputDataReceived(Object sender, DataReceivedEventArgs e);
void process_OutputDataReceived(Object sender, DataReceivedEventArgs e)
{
if (!String.IsNullOrEmpty(e.Data))
{
//numOutputLines++;
// Add the text to the collected output.
//sortOutput.Append(Environment.NewLine +
// "[" + numOutputLines.ToString() + "] - " + outLine.Data);
//this.textBox1.Text=" ";
//textBox1.AppendText(Environment.NewLine + e.Data.ToString());
MessageBox.Show(Environment.NewLine + e.Data.ToString());
//this.feedback.Text = e.Data.ToString() + Environment.NewLine + this.feedback.Text;
}
}
在process_OutputDataReceived方法中,不能访问textbox,报线程访问错误。那怎么才能向textbox里面写内容呢?? 展开
展开全部
不允许子线程操作主线程控件,这是出于安全考虑。
解决有两个方法:
1.窗体Load时候加下面一行代码;
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls=false;
2.写委托,通过委托操作控件。
追问
想知道委托的具体写法,看着还有点迷糊。
追答
加入下面的代码:
private delegate void SetTextDelegate(string txt);
private void SetText(string txt)
{
if (this.textBox1.InvokeRequired)
{
SetTextDelegate delegate= new SetTextDelegate(SetText);
this.textBox1.Invoke(delegate, txt);
}
else
{
textBox1.Text = txt;
}
}
将报错的那句textBox1.Text=" ";改为:
string str="要显示的数据";
SetText(str);
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2015-02-06
展开全部
楼下网友回答正确。我补充下,你要想process_OutputDataReceived里能执行,用 invoke() 的方式来是访问.
if (this.textBox1.InvokeRequired) //这里是表示,如果textBox1不在主线程上,就用委托
{
this.Invoke(new CallBack(EnableButton)); //EnableButton是一个delegate
}
else
{
textBox1.Text = "Enabled";
}
if (this.textBox1.InvokeRequired) //这里是表示,如果textBox1不在主线程上,就用委托
{
this.Invoke(new CallBack(EnableButton)); //EnableButton是一个delegate
}
else
{
textBox1.Text = "Enabled";
}
追问
写到process_OutputDataReceived
if (!String.IsNullOrEmpty(e.Data))这个判断里面吗??CallBack是哪个空间呢?
我的邮箱:590437@163.com.
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2015-02-06
展开全部
textBox1应该在主线程中,不要再新线程中操作。
追问
如果其中有一行需要输出很多的=====================success ,或者===============fail (不止这几个等号,需要执行很长时间,)这一行就不显了,请问这个怎么办啊?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询