Как решить предупреждение CS4014: Звонок не ожидается - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь настроить систему, которая не позволяет моему приложению работать, если USB-кабель устройства отключен. Для этого, если человек активирует функцию, вместо сбоя приложения, я вывожу пользователя на экран загрузки, ожидая повторного подключения кабеля.

Я уже провел много исследований, фактически не обнаружив решение, чтобы исправить эту ошибку и позволить мне заставить ее работать, как я буду sh. Вот мой код:

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 работает только при запуске, в противном случае выдается предупреждение.

Я не пытаюсь скрыть, игнорировать, подавить или что-либо подобное ПРЕДУПРЕЖДЕНИЮ, как все решения в стеке , но разрешить его, чтобы заставить его работать . Ребята, есть идеи?

Мне бы очень хотелось, чтобы мой ShowProgressAsyn c работал правильно при вызове другими не асинхронными методами c

Я пока не очень разбираюсь в C#, может быть, я ' мне не хватает каких-то основ?

1 Ответ

1 голос
/ 04 марта 2020

Я бы использовал такой код для решения обеих проблем:

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

Это способ распространения Стивена Клири .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...