异步任务在 while 循环 == false 后不会完成方法



也许这是一个奇怪的问题,但我似乎想不通。我正在接收来自蓝牙流的数据,在一段时间内读取了所有传入的数据后,我想比较一下这条消息。但实际情况是,它无法完成代码的其余部分。这是如下代码:

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;
}

我所期望的是,在while==0之后,它将停止在while循环中,并完成代码的其余部分。但这似乎并没有发生,它不会完成代码——它会返回到调用方法而不会出现任何错误

提前感谢

是因为在循环inStream.ReadAsync时重复嵌套while(true(并调用bytes = await inStream.ReadAsync(buffer, 0, buffer.Length);吗?

我没有测试它是否有效。你的循环方法看起来不太清楚,也许你可以试试下面的方法:

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);

因此,对于任何在xamarin中有蓝牙问题的人,我刚刚找到了答案。这只是一种从其他设备读取数据的"简单"方法,如Arduino、pic微控制器、Raspberry pi等。我认为有足够的关于写入数据的信息,所以这应该不是问题。但我的答案是从其他设备接收数据。

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;
}

我希望从长远来看,这将对一些人有所帮助。

最新更新