繁体   English   中英

await 运算符只能在异步方法中使用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM