![](/img/trans.png)
[英]await operator can only be used within an async method - but method is asynchron
[英]The await operator can only be used within an async method
我有一个接口ISFactory
如下。
namespace MyApp.ViewModels
{
public interface IStreamFactory
{
Stream CreateSPStream(string sPName);
}
}
在 Windows 非通用版本上,上述功能实现如下。
public Stream CreateSerialPortStream(string serialPortName)
{
var p = new System.IO.Ports.SerialPort();
p.PortName = serialPortName;
p.BaudRate = 9600;
p.RtsEnable = true;
p.DtrEnable = true;
p.ReadTimeout = 150;
p.Open();
return p.BaseStream;
}
此实现在 Windows Universal 中不再可用。 我尝试的内容如下所示。
public Stream CreateSerialPortStream(string serialPortName)
{
var selector = SerialDevice.GetDeviceSelector(serialPortName); //Get the serial port on port '3'
var devices = await DeviceInformation.FindAllAsync(selector);
if (devices.Any()) //if the device is found
{
var deviceInfo = devices.First();
var serialDevice = await SerialDevice.FromIdAsync(deviceInfo.Id);
//Set up serial device according to device specifications:
//This might differ from device to device
serialDevice.BaudRate = 19600;
serialDevice.DataBits = 8;
serialDevice.Parity = SerialParity.None;
}
}
我收到以下错误。
await 运算符只能在异步方法中使用。`
任何人都可以提出解决这个问题的方法。
最好的方法是使方法async
,如编译器错误所示:
public async Task<Stream> CreateSerialPortStreamAsync(string serialPortName)
这也需要改变界面:
Task<Stream> CreateSerialPortStreamAsync(string serialPortName);
是的,这个方法的所有调用者都需要更新。
1)(优先)你可以通过改变其sugnature,让您的异步方法:
public async Task<Stream> CreateSerialPortStream(string serialPortName)
每个调用CreateSerialPortStream
方法也应该是异步的。 (另外我建议将您的方法重命名为CreateSerialPortStreamAsync )
2)如果您出于某种原因不想更改您的方法签名,您可以保持原样,但使用Wait() 。 在这种情况下,您将丢失异步调用。
public Stream CreateSerialPortStream(string serialPortName)
{
var selector = SerialDevice.GetDeviceSelector(serialPortName); //Get the serial port on port '3'
var devicesTask = await DeviceInformation.FindAllAsync(selector);
devicesTask.Wait();
var devices = devicesTask.Result;
if (devices.Any()) //if the device is found
{
var deviceInfo = devices.First();
var serialDeviceTask = SerialDevice.FromIdAsync(deviceInfo.Id);
serialDeviceTask.Wait();
var serialDevice = serialDeviceTask.Result;
//Set up serial device according to device specifications:
//This might differ from device to device
serialDevice.BaudRate = 19600;
serialDevice.DataBits = 8;
serialDevice.Parity = SerialParity.None;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.