我有嵌入式主板(迷你/小型210) 我尝试在C#中构建一个使用 system.socket 和 system.socket.ne 的应用程序(vs2005 - wince5设备应用程序但是我我的设备上有 wince 6 !!)
我的目的是使用以太网发送和接收数据字节。发送,没有问题,但接收确实需要多任务处理。
我应该启动一个任务,以便它可以监听端口,如果有任何数据即将发布但是一旦我将线程部分添加到我的代码中,整个程序崩溃(不是在pc x64核心i5中这样做)但是在嵌入式主板中会崩溃。
如果我消除多任务处理,当 networkstream.read 不在线或 networkstream.read 在线且我在等待数据时,我可能会丢失一些数据程序结束在超时之前不会响应。这是我的一些代码。希望它有所帮助。
此代码确实有效:
private void button_connect_Click(object sender, EventArgs e)
{
try
{
//Thread TH = new Thread(new ThreadStart(con));
//TH.Start();
con();
}
catch
{
MessageBox.Show("THREAD ERROR");
}
}
public void con()
{
try
{
cli = null;
cli = new TcpClient();
cli.Connect(IPAddress.Parse(textBox_ip.Text),Convert.ToInt32(textBox_port.Text));
st = null;
st = cli.GetStream();
button_connect.Enabled = false;
button_Close.Enabled = false;
button_disconnect.Enabled = true;
statusBar1.Text = "Connected to server";
//Thread rec = new Thread(new ThreadStart(recf));
//rec.Start();
}
catch
{
MessageBox.Show("Connection faild","Error");
statusBar1.Text = "Faild to connect to server";
}
此代码剂量不工作:
private void button_connect_Click(object sender, EventArgs e)
{
try
{
Thread TH = new Thread(new ThreadStart(con));
TH.Start();
//con();
}
catch
{
MessageBox.Show("THREAD ERROR");
}
}
public void con()
{
try
{
cli = null;
cli = new TcpClient();
cli.Connect(IPAddress.Parse(textBox_ip.Text),Convert.ToInt32(textBox_port.Text));
st = null;
st = cli.GetStream();
button_connect.Enabled = false;
button_Close.Enabled = false;
button_disconnect.Enabled = true;
statusBar1.Text = "Connected to server";
//Thread rec = new Thread(new ThreadStart(recf));
//rec.Start();
}
catch
{
MessageBox.Show("Connection faild","Error");
statusBar1.Text = "Faild to connect to server";
}
}
正如你所看到的那样,当我的任务中的一个任务在代码中,第二个任务被评论时,我发现了这个崩溃
我提前感谢您的帮助
答案 0 :(得分:0)
崩溃可能是由更新辅助线程的UI元素引起的。
con
方法读取文本框并更新几个按钮以及状态栏,这应该只在主应用程序线程上发生。
要验证这是否是问题,您可以简单地注释掉访问UI元素的con
方法中的行(在启动线程之前将文本框值复制到成员字符串,或者只是硬编码IP地址)并重新运行应用程序。
然后要真正解决问题,你必须调查Control.Invoke。