我正在尝试开发一个可在Windows IoT核心上运行的UWP应用程序。这个应用程序将读取来自Arduino的一些传感器数据,然后将其作为消息发送到我的azure iothub。我一直在代码中使用异步方法。
private async Task ReadAsync(CancellationToken cancellationToken)
{
Task<UInt32> loadAsyncTask;
uint ReadBufferLength = 1024;
// If task cancellation was requested, comply
cancellationToken.ThrowIfCancellationRequested();
// Set InputStreamOptions to complete the asynchronous read operation when one or more bytes is available
dataReaderObject.InputStreamOptions = InputStreamOptions.Partial;
using (var childCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken))
{
// Create a task object to wait for data on the serialPort.InputStream
loadAsyncTask = dataReaderObject.LoadAsync(ReadBufferLength).AsTask(childCancellationTokenSource.Token);
// Launch the task and wait
UInt32 bytesRead = await loadAsyncTask;
if (bytesRead > 0)
{
var tempData = dataReaderObject.ReadString(bytesRead);
rcvdText.Text = tempData;
status.Text = "bytes read successfully!";
await SendDeviceToCloudMessagesAsync(tempData);
}
}
}
SendDeviceToCloudMessagesAsync的定义:
private async Task SendDeviceToCloudMessagesAsync(string data)
{
//do some string manipulations on data and create the telemetry object.
deviceClient = DeviceClient.CreateFromConnectionString(deviceConnString);
var messageString = JsonConvert.SerializeObject(telemetry);
var message = new Message(Encoding.ASCII.GetBytes(messageString));
await deviceClient.SendEventAsync(message);
await Task.Delay(1000);
}
这就是调用方法的方法:
// keep reading the serial input
while (true)
{
await ReadAsync(ReadCancellationTokenSource.Token);
}
这里的期望是应用程序应继续读取串行输入,并将其连续循环发送到iothub。但问题是它只执行一次,然后返回到UI。如果我删除行await SendDeviceToCloudMessagesAsync(tempData),那么代码继续监听串行输入。所以我理解它与SendEventAsync方法有关。我能够在.net控制台应用程序中循环使用此方法,但我不知道如何在UWP中修复它。
以下是SendEventAsync方法的签名(来自元数据):
public Task SendEventAsync(Message message);
我对异步编程很新。如果我需要在问题中提供额外的输入,请发表评论。
答案 0 :(得分:0)
你有线程问题。 尝试使用ThreadPool.QueueUserWorkItem来生成一个发送消息的进程。