Моя программа зависла, прежде чем читать из NetworkStream - PullRequest
0 голосов
/ 06 ноября 2019

Здравствуйте, я студент и еще не привык к c #. Я пишу программу с сервером и клиентом, которые связаны с сокетом. Я пытаюсь реализовать способ чтения из потока, когда данные доступны, с циклом while. Я могу избежать сбоя, если я покажу сообщение с 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";
    }

1 Ответ

0 голосов
/ 06 ноября 2019

Теперь это в основном догадки, поскольку у нас едва хватает кода, чтобы сказать что-то наверняка:

А как насчет JiT Compiler?

Одна из его целей - обнаружение мертвого кода. Он вырезает код, который, как он предсказывает, не будет иметь эффекта. К сожалению, это все еще только компьютерная программа, поэтому случаются ложные срабатывания. Например, пытаясь форсировать OOM Exception для установок x32 Framework, мне пришлось изо всех сил пытаться исключить код , а не с помощью 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предотвратит вырезание всей этой функции как мертвого кода. Вывод чего-либо на пользователя всегда считается «иметь эффект». Однако отдельные его части по-прежнему имеют право на обнаружение мертвого кода.

К сожалению, вы не предоставили нам минимальный, полный проверяемый пример. Поэтому мы не можем помочь вам разобраться в этом.

...