2个线程作不同是动作,但是有一个相同的动作就是往窗体的text文本控件里添加各自操作的日志,我开一个线程就没有任何问题,我开2个线程就会报“未将对象引用设置到对象的实例。”代码如下是.net开发的windows应用程序
窗体load事件中启动线程的代码: private void Form1_Load(object sender, EventArgs e)
{
threadGet1 = new Thread(new ThreadStart(doGetFromXml1));
threadGet2 = new Thread(new ThreadStart(doGetFromXml2)); threadGet1.Start();
threadGet2.Start();
}两个线程的代码:
public void doGetFromXml1()
{
while (true)
{
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
richTextBox1.Text = "aaaa\r\n";
}
} public void doGetFromXml2()
{
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
while (true)
{
richTextBox1.Text = "oooo\r\n"; //运行到这里就会报“未将对象引用设置到对象的实例。”的错误
}
}
要如何解决呢?
窗体load事件中启动线程的代码: private void Form1_Load(object sender, EventArgs e)
{
threadGet1 = new Thread(new ThreadStart(doGetFromXml1));
threadGet2 = new Thread(new ThreadStart(doGetFromXml2)); threadGet1.Start();
threadGet2.Start();
}两个线程的代码:
public void doGetFromXml1()
{
while (true)
{
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
richTextBox1.Text = "aaaa\r\n";
}
} public void doGetFromXml2()
{
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
while (true)
{
richTextBox1.Text = "oooo\r\n"; //运行到这里就会报“未将对象引用设置到对象的实例。”的错误
}
}
要如何解决呢?
类里边加一个成员object sysobj=new Object();
lock(sysobj)
{
richTextBox1.Text = "oooo\r\n";
}
*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) http://feiyun0112.cnblogs.com/
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Threading;
namespace WindowsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
Thread threadGet1, threadGet2; threadGet1 = new Thread(new ThreadStart(doGetFromXml1)); threadGet2 = new Thread(new ThreadStart(doGetFromXml2)); threadGet1.Start();
threadGet2.Start(); } object sysobj = new Object(); public void doGetFromXml1()
{ while (true)
{
lock (sysobj)
{
ShowMessage("oooo\r\n");
}
}
} public void doGetFromXml2()
{ while (true)
{ lock (sysobj)
{
ShowMessage("aaaa\r\n");
}
} } delegate void ShowMess(String s);
void ShowMessage(string s)
{
if (this.richTextBox1.InvokeRequired == true)
{
this.richTextBox1.Invoke(new ShowMess(ShowMessage),new object[]{s});
}
else
{
this.richTextBox1.Text = s;
}
}
}
}
ThreadState ts=线程名.ThreadState;
if (ts == ThreadState.Unstarted || ts == ThreadState.Stopped)
{
线程名.Start();
}
else
{
线程名.Resume();
}个人的建议,最近也在捣鼓多线程这个东东,也比较迷茫。
正解,谢谢!
也谢谢feiyun0112.结贴了