【问题标题】:The await operator can only be used within an async methodawait 运算符只能在异步方法中使用
【发布时间】:2023-04-04 19:16:01
【问题描述】:

我有一个接口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 运算符只能在异步方法中使用。`

任何人都可以提出解决这个问题的方法。

【问题讨论】:

  • public async Task<Stream> CreateSerialPortStream(string serialPortName)
  • @Nkosi - 我可以从Task<Stream> 获得Stream。我正在将 stream 传递给其他现在失败的函数。
  • @Nkosi - 所以我必须更改界面?
  • 我可能说得太早了。检查serialDevice.InputStream
  • 是的,如果你正在做async/await,那么你必须返回一个Task

标签: c# async-await


【解决方案1】:

最好的方法是制作方法async,正如编译器错误所示:

public async Task<Stream> CreateSerialPortStreamAsync(string serialPortName)

这也需要改变界面:

Task<Stream> CreateSerialPortStreamAsync(string serialPortName);

是的,这个方法的所有调用者都需要更新。

【讨论】:

  • 函数会返回什么?
  • @liv2hak 你只返回一个Stream,它会自动包装在Task&lt;Stream&gt;
  • @zerkms - 当我将异步添加到接口函数时,它说修改后的异步对此项无效。
  • @liv2hak async 关键字是实现的一部分,而不是接口。只需再次查看答案 - 它提到方法和接口的签名略有不同。
【解决方案2】:

1)(首选)您可以通过将其签名更改为 async 来使您的方法:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    相关资源
    最近更新 更多