Asyn c задача не завершится sh методом через некоторое время l oop == false - PullRequest
1 голос
/ 30 марта 2020

Возможно странный вопрос, но я не могу понять это. Я получаю данные из bluetoothstream, после того как через некоторое время прочитал все входящие данные. L oop Я хотел бы сравнить это сообщение. Но то, что происходит, это то, что он просто не завершит sh остальную часть кода. Этот код выглядит следующим образом:

 public void beginListenForData()
    {
        try
        {
            inStream = btSocket.InputStream;
        }
        catch (IOException ex)
        {
            Console.WriteLine(ex.Message);
        }
        Task.Run(async() =>
        {
            while (true)
            {
                try
                {
                    bytes = await inStream.ReadAsync(buffer, 0, buffer.Length);

                    while (bytes != 0)
                    {
                        eindtekst = String.Concat(eindtekst, Encoding.ASCII.GetString(buffer, 0, bytes));
                        Array.Clear(buffer, 0, buffer.Length);
                        bytes = await inStream.ReadAsync(buffer, 0, buffer.Length);
                    }

                    if (eindtekst == "D0O")
                    {
                        Array.Clear(buffer, 0, buffer.Length);
                        Xamarin.Forms.MessagingCenter.Send((IBluetoothService)this, "redButtonClicked");
                        eindtekst = "";
                        inStream.Flush();
                        inStream.Dispose();
                        inStream.Close();
                    }
                    else if (eindtekst == "StopTijd")
                    {
                        Array.Clear(buffer, 0, buffer.Length);
                        Xamarin.Forms.MessagingCenter.Send((IBluetoothService)this, "Win");
                        eindtekst = "";
                        inStream.Flush();
                        inStream.Dispose();
                        inStream.Close();
                    }

                    if (bytes == 0)
                    {
                        eindtekst = "";
                        inStream.Flush();
                        inStream.Dispose();
                        inStream.Close();
                    }
                }
                catch (IOException e)
                {
                System.Diagnostics.Debug.WriteLine("Fout bij het ontvangen " + e.Message);
                break;
                }
            }
    }).ConfigureAwait(false);
        return;
    }

Что я ожидал бы, так это то, что через некоторое время == 0 он остановится в этом случае, пока l oop и fini sh остальной код. Но, похоже, этого не происходит, он не завершит sh код, который возвращается к вызывающему методу без ошибок или около того.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Так что для любого, у кого проблемы с bluetooth в xamarin, я только что нашел ответ. Это просто «простой» метод для чтения данных с другого устройства, такого как Arduino, pi c, микроконтроллер, Raspberry pi, et c. Я думаю, что достаточно информации о записи данных, чтобы не было проблем. Но мой ответ на получение данных с другого устройства.

 public void beginListenForData()
    {
        try
        {
            inStream = btSocket.InputStream;
        }
        catch (IOException ex)
        {
            Console.WriteLine(ex.Message);
        }
        Task.Run(async () =>
        {
            while (true)
            {
                try
                {
                    if (inStream.IsDataAvailable() == true)
                    {
                        bytes = await inStream.ReadAsync(buffer, 0, buffer.Length);
                        eindtekst = String.Concat(eindtekst, Encoding.ASCII.GetString(buffer, 0, bytes));
                        Array.Clear(buffer, 0, buffer.Length);

                        if (eindtekst == "Received")
                        {
                            Xamarin.Forms.MessagingCenter.Send<IBluetoothService, bool>(this, "Received", true);
                        }
                        else if (eindtekst == "D0O")
                        {
                            Xamarin.Forms.MessagingCenter.Send((IBluetoothService)this, "redButtonClicked");
                        }
                        else if (eindtekst == "StopTijd")
                        {
                            Xamarin.Forms.MessagingCenter.Send((IBluetoothService)this, "Win");
                        }
                        eindtekst = "";
                    }
                }
                catch (Exception e)
                {
                    System.Diagnostics.Debug.WriteLine("Fout bij het ontvangen " + e.Message);
                    break;
                }
            }
        }).ConfigureAwait(false);
        return;
    }

Я надеюсь, что это поможет кому-то в долгосрочной перспективе.

0 голосов
/ 31 марта 2020

Это потому, что вы неоднократно вкладывали в то время как (true) и вызывали bytes = await inStream.ReadAsync(buffer, 0, buffer.Length);, когда вы l oop inStream.ReadAsync?

Я не проверял это, чтобы видеть, работало ли это. Ваш метод зацикливания выглядит не очень четко , возможно, вы могли бы попробовать ниже:

 Task.Run(async() =>
    {        
         int bytes = 0;
           try
            {

                while (bytes =await inStream.ReadAsync(buffer, 0, buffer.Length) > 0)
                {
                    eindtekst = String.Concat(eindtekst, Encoding.ASCII.GetString(buffer, 0, bytes));
                    Array.Clear(buffer, 0, buffer.Length);

                }

                if (eindtekst == "D0O")
                {
                    Array.Clear(buffer, 0, buffer.Length);
                    Xamarin.Forms.MessagingCenter.Send((IBluetoothService)this, "redButtonClicked");
                    eindtekst = "";
                    inStream.Flush();
                    inStream.Dispose();
                    inStream.Close();
                }
                else if (eindtekst == "StopTijd")
                {
                    Array.Clear(buffer, 0, buffer.Length);
                    Xamarin.Forms.MessagingCenter.Send((IBluetoothService)this, "Win");
                    eindtekst = "";
                    inStream.Flush();
                    inStream.Dispose();
                    inStream.Close();
                }

                if (bytes == 0)
                {
                    eindtekst = "";
                    inStream.Flush();
                    inStream.Dispose();
                    inStream.Close();
                }
            }
            catch (IOException e)
            {
            System.Diagnostics.Debug.WriteLine("Fout bij het ontvangen " + e.Message);
            break;
            }
}).ConfigureAwait(false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...