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里面写内容呢??
展开
 我来答
v雪地里的猫
2015-02-06 · TA获得超过864个赞
知道小有建树答主
回答量:401
采纳率:100%
帮助的人:240万
展开全部

不允许子线程操作主线程控件,这是出于安全考虑。

解决有两个方法:

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";
}
追问
写到process_OutputDataReceived
if (!String.IsNullOrEmpty(e.Data))这个判断里面吗??CallBack是哪个空间呢?

我的邮箱:590437@163.com.
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2015-02-06
展开全部
textBox1应该在主线程中,不要再新线程中操作。
追问
如果其中有一行需要输出很多的=====================success ,或者===============fail (不止这几个等号,需要执行很长时间,)这一行就不显了,请问这个怎么办啊?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式