如何解决警告CS4014:未等待呼叫

时间:2020-03-04 07:33:28

标签: c# async-await compiler-warnings

我正在尝试建立一个系统,如果设备的USB电缆已断开连接,则会阻止我的应用程序运行。为此,如果该人激活了某个功能,而不是崩溃了该应用程序,我将带用户到加载屏幕,同时等待电缆重新连接。

我已经进行了很多研究,而没有找到实际的解决方案来纠正此错误并让我按自己的意愿工作。这是我的代码:

public async Task WaitingPort()
{
    var controllerPort = await this.ShowProgressAsync("Seeking device", " "); //Warning starts here
    controllerPort.SetIndeterminate();
    await Task.Run(() =>
    {
        while (port is null)
        {
            port = CheckPort();
            controllerPort.SetMessage("please plub USB");
        }
    });
    await controllerPort.CloseAsync();
}

private SerialPort CheckPort()
{
    string[] listPort = SerialPort.GetPortNames();
    foreach(string namePort in listPort)
    {
        SerialPort port = new SerialPort(namePort, 9600);
        if (!port.IsOpen)
        {
            try
            {
                port.Open();
                port.ReadTimeout = 1500;
                string data = port.Readline();
                if (data.Substring(0, 1) == "A")
                {
                    port.ReadTimeout = 200;
                    port.Write("777"); // to make it stop sending "A"
                    return port;
                }
                else
                {
                port.Close();
                }
            }
            catch (Exception e1)
            {
                port.Close();
            }
        }
    }
    return null;
}

public MainWindow()
{
    WaitingPort(); //WARNING CS4014
    ...
}

private async void Button_ClickOpen(object sender, RoutedEventArgs e)
{
    var controllerPort = await this.ShowProgressAsync("Please wait", " ");
    controllerPort.SetIndeterminate();
    await Task.Run(() =>
    {
        try
        {
            blabla
        }
        catch (Exception)
        {
            WaitingPort(); //WARNING CS4014
        }
    }
}

我已经尝试了多种解决方案...:

将我的虚空变成任务

_ = WaitingPort(); //隐藏错误而不解决它

WaitingPort()。Wait(); //这里是同样的情况,隐藏但没有解决

await MyAsyncMethod()。ConfigureAwait(false); //这里是同样的情况,隐藏但没有解决

当前,WaitingPort方法仅在启动时起作用,否则会发出警告。

我不想尝试隐藏,忽略,抑制或类似堆栈上的每个解决方案之类的警告,而是要解决它,使其正常工作。你们有什么主意吗?

当其他非异步方法调用时,我真的希望ShowProgressAsync正常工作

我还不太熟悉C#,也许我缺少一些基本知识?

1 个答案:

答案 0 :(得分:1)

我会使用这样的代码来解决这两个问题:

public MainWindow()
{
    this.Initialization = this.WaitingPort();
    ...
}

public Task Initialization { get; }

private async void Button_ClickOpen(object sender, RoutedEventArgs e)
{
    await this.Initialization; // Do this in every public method and non-public if they're called out of an 'event'

    var controllerPort = await this.ShowProgressAsync("Please wait", " ");
    controllerPort.SetIndeterminate();
    await Task.Run(async () =>
    {
        try
        {
            blabla
        }
        catch (Exception)
        {
            await WaitingPort();
        }
    }
}

这是Stephen Cleary传播的方式。