«Неожиданный конец потока» на PostAsync - PullRequest
0 голосов
/ 31 октября 2018

Я создаю небольшой личный проект с помощью форм Xamarin. В течение некоторого времени я случайно (вероятность 80%) получаю следующее исключение, и я не знаю почему: «Неожиданный конец потока».

Часть трассировки стека:

--- Конец трассировки стека от предыдущего местоположения, где было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Задача System.Threading.Tasks.Task) [0x0003e] в <43dbbdc147f2482093d8409abb04c233>: 0 в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача System.Threading.Tasks.Task) [0x00028] в <43dbbdc147f2482093d8409abb04c233>: 0 в System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (Задача System.Threading.Tasks.Task) [0x00008] в <43dbbdc147f2482093d8409abb04c233>: 0 в System.Runtime.CompilerServices.TaskAwaiter 1[TResult].GetResult () [0x00000] in <43dbbdc147f2482093d8409abb04c233>:0 at System.IO.Stream.EndRead (System.IAsyncResult asyncResult) [0x0006a] in <43dbbdc147f2482093d8409abb04c233>:0 at System.IO.Stream+<>c.<BeginEndReadAsync>b__43_1 (System.IO.Stream stream, System.IAsyncResult asyncResult) [0x00000] in <43dbbdc147f2482093d8409abb04c233>:0 at System.Threading.Tasks.TaskFactory 1 + FromAsyncTrimPromise 1[TResult,TInstance].Complete (TInstance thisRef, System.Func 3 [T1, T2, TResult] endMethod, System.IAsyncResult asyncResult, System.Boolean требуется синхронизация) [0x00000] в <43dbbdc147f2482093d8409abb04c233>: 0

Это мне мало что говорит.

Это код, из которого выдается исключение:

public async Task<string> PostDataToService(string sendURI, string json)
{
    HttpClient client = Client;
    string strresult = "";
    try
    {
        Debug.WriteLine("### DataService#PostDataToService Posting: " + sendURI);
        Debug.WriteLine("### JSON: " + json);
        var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
        _httpResponse = await client.PostAsync(sendURI, content);
        if (_httpResponse.IsSuccessStatusCode)
        {
            strresult = await _httpResponse.Content.ReadAsStringAsync();
        }
    }
    catch (Exception ex) when (ex is TaskCanceledException || ex is OperationCanceledException)
    {
        Debug.WriteLine("### DataService#PostDataToService Timeout!");
        MessagingCenter.Send<App>((App)Application.Current, Settings.MESSAGING_COMMUNICATIONTIMEOUT);
    }
    catch (System.Exception ex)
    {
        Debug.WriteLine("### DataService#PostDataToService Exception@" + DateTime.Now);
        Debug.WriteLine("### DataService#PostDataToService Error: " + ex.Message);
        Debug.WriteLine(ex.StackTrace);
        MessagingCenter.Send<App>((App)Application.Current, Settings.MESSAGING_COMMUNICATIONERROR);
    }
    Debug.WriteLine("### DataService#PostDataToService Returning for URI " + sendURI);
    Debug.WriteLine("### DataService#PostDataToService Returning: " + strresult);
    return strresult;
}

Фактическое исключение выдается в методе PostAsync.

Любая помощь очень ценится, поскольку в настоящее время я потрачу на это несколько часов в течение нескольких дней.

Редактировать: одна дополнительная информация: сообщение выполняется в той части, где сервер уже ответил и вернул результат.

...