Как правильно отказаться от веб-поста asyn c c# - PullRequest
0 голосов
/ 18 июня 2020

У меня есть несколько веб-сообщений в моем приложении, которым необходимо отправить текстовые данные на сервер, но кроме ожидания завершения публикации, не должны задерживаться методы, которые вызываются из (большие сообщения данных, которые замедляют logi c et c, которого не должно быть).

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

private void DoSomethingandPost()
{
        BeforeMethod();    
        PushWebDataAsync(TheData1);
        PushWebDataAsync(TheData2);
        AfterMethod();
}


public static async void PushWebDataAsync(string Data)
{
        ...makes changes to the data...
        try
        {
                _ = pushDataAync(Data);
        }
        catch (Exception e)
        {
                 _ = pushDataAync(Data);
        }
}

public System.Threading.Tasks.Task<System.Xml.XmlNode> pushDataAync(string Data)
{
        return base.Channel.pushDataAync(Data);
}

Мне кажется, что если «AfterMethod» возвращается до того, как данные были завершены, то соединение с сервером прерывается, и поэтому данные не передаются полностью.

То, что я пытаюсь достичь, на самом деле, DoSomethingandPost () завершается и завершается, но два asyn c Post продолжаются сами по себе до завершения, затем завершаются.

1 Ответ

1 голос
/ 18 июня 2020

Если AfterMethod должен выполняться после двух вызовов PushWebDataAsync, тогда сделайте последующий возврат Task, сделайте AfterMethod asyn c и дождитесь методов pu sh. DoSomethingandPost вернется к первому оператору ожидания, выполняя остальную работу позже. Если вы хотите выполнять pu sh одновременно, выполните

var task1 = PushWebDataAsync(TheData1);
var task2 = PushWebDataAsync(TheData2);
await Task.WhenAll(new []{task1, task2});
...

. Рекомендуется избегать использования async void, поскольку это не позволяет вызывающему абоненту узнать, был ли вызов успешным или нет. Если вы знаете, что это никогда не понадобится, например, в обработчике событий для кнопки, тогда рекомендуется обрабатывать любое исключение, которое может возникнуть.

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