C#线程内访问线程外数据

baoqi_ 2012-11-27 04:19:44
是一个winform小程序。主要功能是:

1、在窗体运行前新建线程,在线程内开启socket服务。
2、当有新的连接时,在主窗口的一个textbox中打印相关信息。

主要问题:在线程内的数据无法在textbox中打印出来。

提示:“线程间操作无效: 从不是创建控件“textBox1”的线程访问它”

源代码:
namespace Server_2
{
public partial class Form1 : Form
{
Thread aThread = null;
private delegate void FlushClient(string s); //代理
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
textBox1.Text += ("正在开启server服务" + "\n" + ".......请稍候..." + "\n");
aThread = new Thread(new ThreadStart(StartSocketServer));
aThread.IsBackground = true;
aThread.Start();
textBox1.Text += ("server is start!" + "\n");
}
public void StartSocketServer()
{

IPAddress ip = IPAddress.Parse("192.168.168.163");
//IP地址跟端口的组合
IPEndPoint iep = new IPEndPoint(ip, 8001);
//创建Socket
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//绑定Socket
socket.Bind(iep);
//服务器已经做好接收任何连接的准备
socket.Listen(10);
while (true)
{
//执行accept方法
Socket Client = socket.Accept();
byte[] message = new byte[1024];
NetworkStream networkStream = new NetworkStream(Client);
int len = networkStream.Read(message, 0, message.Length);
//byte数组转换成string
string output = System.Text.Encoding.Unicode.GetString(message);
string pagehtml = ("一共从客户端接收了" + len.ToString() + "字节。接收字符串为:" + output);
ThreadFunction(pagehtml);
}
}
private void ThreadFunction(string s)
{
textBox1.Text = s;
}
}
}




我曾想过用委托。但是初学这玩意,有些地方没想明白。望高手指点。
...全文
267 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
baoqi_ 2012-11-30
  • 打赏
  • 举报
回复
引用 8 楼 lp244392323 的回复:
在启动线程之前设置CheckForIllegalCrossThreadCalls=false
CheckForIllegalCrossThreadCalls=false这玩意搞定。 但是没搞懂是啥子意思。。。。
vssvss 2012-11-29
  • 打赏
  • 举报
回复
backgroundworker 满足你的需求
  • 打赏
  • 举报
回复
在启动线程之前设置CheckForIllegalCrossThreadCalls=false
garfieldzf 2012-11-28
  • 打赏
  • 举报
回复
1、简单点可以使用:CheckForIllegalCrossThreadCalls 2、使用BeginInvoke, 也就是InvokeRequired这种形式。
baoqi_ 2012-11-28
  • 打赏
  • 举报
回复
求,简单例子!
awfssv 2012-11-27
  • 打赏
  • 举报
回复
委托或者允许线程不安全访问
baoqi_ 2012-11-27
  • 打赏
  • 举报
回复
引用 3 楼 sinodzh 的回复:
delegate void printhehe(string s) private void ThreadFunction(string s) { if (this.textBox1.InvokeRequired)//等待异步 { ……
this.Invoke(printhehe(ThreadFunction),new object[]{s}); //printhehe?????
sinodzh 2012-11-27
  • 打赏
  • 举报
回复
delegate void printhehe(string s)  private void ThreadFunction(string s)         {             if (this.textBox1.InvokeRequired)//等待异步             {                                  this.Invoke(printhehe(ThreadFunction),new object[]{s});                            }             else             {                 this.textBox1.Text = s;//<span style="color: #FF0000;">这里</span>             }         }
baoqi_ 2012-11-27
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
要用委托http://www.cnblogs.com/mokey/articles/2095457.html
我现在该了点,但是还是没搞懂下面这几行怎么写。。。。。
namespace Server_2
{
    public partial class Form1 : Form
    {
        Thread aThread = null;
        private delegate void FlushClient(string s); //代理
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            textBox1.Text += ("正在开启server服务" + "\n" + ".......请稍候..." + "\n");
            aThread = new Thread(new ThreadStart(StartSocketServer));
            aThread.IsBackground = true;
            aThread.Start();
            textBox1.Text += ("server is start!" + "\n");
        }
        public void StartSocketServer()
        {

            IPAddress ip = IPAddress.Parse("192.168.168.163");
            //IP地址跟端口的组合
            IPEndPoint iep = new IPEndPoint(ip, 8001);
            //创建Socket
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //绑定Socket
            socket.Bind(iep);
            //服务器已经做好接收任何连接的准备
            socket.Listen(10);
            while (true)
            {
                //执行accept方法
                Socket Client = socket.Accept();
                byte[] message = new byte[1024];
                NetworkStream networkStream = new NetworkStream(Client);
                int len = networkStream.Read(message, 0, message.Length);
                //byte数组转换成string
                string output = System.Text.Encoding.Unicode.GetString(message);
                string pagehtml = ("一共从客户端接收了" + len.ToString() + "字节。接收字符串为:" + output);
                ThreadFunction(pagehtml);
            }
        }
        private void ThreadFunction(string s)
        {
            if (this.textBox1.InvokeRequired)//等待异步
            {
                FlushClient fc = new FlushClient(ThreadFunction);
                 this.Invoke(fc); //通过代理调用刷新方法
                 this.textBox1.Text = s;//这里
            }
            else
            {
                this.textBox1.Text = s;//这里
            }
        }
    }
}
bdmh 2012-11-27
  • 打赏
  • 举报
回复

110,524

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧