[英]My program freeze, before reading from NetworkStream
你好,我是一名學生,我還不習慣 c#。 我正在編寫一個帶有服務器和客戶端的程序,它們通過套接字連接。 我正在嘗試實現一種從 stream 讀取數據的方法,當數據可用時,使用 while 循環。 如果在讀/寫 stream 之前使用 MessageBox.Show() 顯示消息,我可以避免崩潰。 我不知道為什么沒有顯示消息的程序不起作用...
public partial class Form1 : Form
{
const int port = 22222;
const string ip = "127.0.0.1";
IPAddress ipServer = IPAddress.Parse(ip);
TcpListener server = null;
TcpClient client = null;
Thread thServer = null;
Thread thClient = null;
NetworkStream dataStream = null;
const int a = 11;
const int n = 251;
string receivedMessage = "";
bool? izbira = null;
public Form1()
{
InitializeComponent();
thServer = new Thread(new ThreadStart(startServer));
thServer.IsBackground = true;
thServer.Start();
}
void startServer() {
server = new TcpListener(ipServer, port);
server.Start();
textBox4.Invoke(new Action(() => textBox4.AppendText("Strežnik: zagnan na: IP: " + ip + ", port:" + port)));
client = new TcpClient();
client = server.AcceptTcpClient();
NetworkStream dataStream = client.GetStream();
textBox4.Invoke(new Action(() => textBox4.AppendText(Environment.NewLine + "Strežnik: Sprejet nov uporabnik")));
if (izbira == true)
{
byte[] message = new byte[1024];
if(dataStream.DataAvailable)
dataStream.Read(message, 0, message.Length);
receivedMessage = Encoding.UTF8.GetString(message);
textBox4.Invoke(new Action(() => textBox4.AppendText(Environment.NewLine + "Strežnik: Dobil sem sporočilo: " + receivedMessage)));
message = new byte[1024];
message = Encoding.UTF8.GetBytes("drugo sporocilo!");
dataStream.Write(message, 0, message.Length);
}
else {
byte[] message = new byte[1024];
message = Encoding.UTF8.GetBytes("serbus");
dataStream.Write(message, 0, message.Length);
}
}
void button1_Click(object sender, EventArgs e) {
if (izbira == null) {
textBox4.Invoke(new Action(() => textBox4.AppendText(Environment.NewLine + "Izbrati morate ali boste datoteko prenesli ali poslali!")));
return;
}
this.button1.Enabled = false;
client = new TcpClient();
IPAddress insertedIp = IPAddress.Parse(textBox1.Text);
client.Connect(insertedIp, Convert.ToInt32(textBox3.Text));
dataStream = client.GetStream();
if (izbira == true)
{
byte[] message = new byte[1024];
message = Encoding.UTF8.GetBytes("hejj");
dataStream.Write(message, 0, message.Length);
message = new byte[1024];
MessageBox.Show("");
while (true)
{
if (dataStream.DataAvailable)
{
dataStream.Read(message, 0, message.Length);
break;
}
}
receivedMessage = Encoding.UTF8.GetString(message);
textBox4.Invoke(new Action(() => textBox4.AppendText(Environment.NewLine + "Strežnik: Dobil sem sporočilo: " + receivedMessage)));
}
else {
byte[] message = new byte[1024];
MessageBox.Show("Serbus");
while (true)
{
if (dataStream.DataAvailable)
{
dataStream.Read(message, 0, message.Length);
break;
}
}
receivedMessage = Encoding.UTF8.GetString(message);
textBox4.Invoke(new Action(() => textBox4.AppendText(Environment.NewLine + "Strežnik: Dobil sem sporočilo: " + receivedMessage)));
}
}
void buttonUpload_Click(object sender, EventArgs e) {
izbira = true;
this.buttonDownload.Enabled = false;
}
void buttonDownload_Click(object sender, EventArgs e) {
izbira = false;
this.buttonUpload.Enabled = false;
this.button2.Text = "Prenesi";
}
現在這主要是猜測,因為我們幾乎沒有足夠的代碼來肯定地說什么:
JiT 編譯器呢?
它的目的之一是檢測死代碼。 它削減了它預測不會產生影響的代碼。 不幸的是,它仍然只是一個計算機程序,所以會發生誤報。 例如,試圖強制 x32 框架安裝出現 OOM 異常,我不得不 go不讓JiT 刪除代碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace OOM_32_forced
{
class Program
{
static void Main(string[] args)
{
//each short is 2 byte big, Int32.MaxValue is 2^31.
//So this will require a bit above 2^32 byte, or 2 GiB
short[] Array = new short[Int32.MaxValue];
/*need to actually access that array
Otherwise JIT compiler and optimisations will just skip
the array definition and creation */
foreach (short value in Array)
Console.WriteLine(value);
}
}
}
MessageBox 將防止整個 function 被刪除為死代碼。 向用戶輸出某些東西總是被假定為“有效果”。 然而,它的單獨部分仍然有資格進行死代碼檢測。
很遺憾,您沒有向我們提供最小的、完整的可驗證示例。 因此,我們無法真正幫助您進一步弄清楚。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.