C # WPF Показывать экран загрузки при отправке и получении сокетов C # - PullRequest
0 голосов
/ 14 февраля 2019

Я создаю приложение WPF, которое использует сокет для передачи данных на сервер и с сервера.Проблема: при отправке и получении данных с сервера экран завис, и я хотел бы добавить простую анимацию загрузки, чтобы конечный пользователь знал, что она в данный момент загружается, но я не знаю, как

Мой код сокета C #:

public static string SendRecOne(string dataToSvr)
    {
        TcpClient client = new TcpClient(SERVER_NAME, PORT);
        #region SendRequest
        int ByteCount = Encoding.ASCII.GetByteCount(dataToSvr); //How much bytes?
        byte[] ByteBuffer = new byte[1024]; //initialize byte array
        ByteBuffer = Encoding.ASCII.GetBytes(dataToSvr);
        NetworkStream stream = client.GetStream();
        stream.Write(ByteBuffer, 0, ByteBuffer.Length);
        #endregion
        #region Receive Response
        //byte[] responseData = new byte[client.ReceiveBufferSize];
        //int bytesRead = stream.Read(responseData, 0, client.ReceiveBufferSize);
        int i;
        string ToReturn = null;
        ByteBuffer = new byte[ByteBuffer.Length];
        MemoryStream ms = new MemoryStream();
        while (true)
        {
            if (stream.DataAvailable)
            {
                while ((i = stream.Read(ByteBuffer, 0, ByteBuffer.Length)) != 0)
                {
                    ms.Write(ByteBuffer, 0, ByteBuffer.Length);
                    if (stream.DataAvailable)
                        continue;
                    else
                        break;
                }
                ToReturn = Encoding.ASCII.GetString(ms.ToArray());
                return ToReturn;
            }
        }
        #endregion

, и я вызываю его после нажатия кнопки в окне, которое называется «login.xaml», и после проверки данных все в порядке, оно закрывает текущие окнаи инициализирует dashboard.xaml.Мне просто нужно добавить анимацию при общении с сервером.

Спасибо!

1 Ответ

0 голосов
/ 14 февраля 2019

Вызовите метод SendRecOne в фоновом потоке или сделайте его асинхронным, используя * Асинхронные перегрузки:

public static async Task<string> SendRecOne(string dataToSvr)
{
    progressBar.Visibility = Visibility.Visible;
    string ToReturn = null;
    using (TcpClient client = new TcpClient(SERVER_NAME, PORT))
    {
        int ByteCount = Encoding.ASCII.GetByteCount(dataToSvr); //How much bytes?
        byte[] ByteBuffer = new byte[1024]; //initialize byte array
        ByteBuffer = Encoding.ASCII.GetBytes(dataToSvr);
        NetworkStream stream = client.GetStream();
        await stream.WriteAsync(ByteBuffer, 0, ByteBuffer.Length);

        //byte[] responseData = new byte[client.ReceiveBufferSize];
        //int bytesRead = await stream.ReadAsync(responseData, 0, client.ReceiveBufferSize);
        int i;
        ByteBuffer = new byte[ByteBuffer.Length];
        MemoryStream ms = new MemoryStream();
        if (stream.DataAvailable)
        {
            while ((i = await stream.ReadAsync(ByteBuffer, 0, ByteBuffer.Length)) != 0)
            {
                await ms.WriteAsync(ByteBuffer, 0, ByteBuffer.Length);
                if (!stream.DataAvailable)
                    break;
            }
            ToReturn = Encoding.ASCII.GetString(ms.ToArray());
        }
        progressBar.Visibility = Visibility.Collapsed;
    }
    return ToReturn;
}

XAML:

<ProgressBar x:Name="progressBar" IsIndeterminate="True" />

Поток пользовательского интерфейса не может одновременно обрабатывать сообщения и выполнять ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...