Получение записей из таблицы учетных записей хранилища Azure с использованием c # при разработке кроссплатформенного приложения с использованием ошибки xamarin - PullRequest
0 голосов
/ 30 июня 2018

Получение записей из таблицы учетных записей хранилища Azure с использованием c # при разработке кроссплатформенного приложения с использованием ошибки xamarin.

await tbl.ExecuteAsync(retrieveOperation);

Я СОБЛЮДАЮ ЭТУ ССЫЛКУ !

Этот код выдает исключение (ожидание времени и ошибка асинхронности с использованием storageexception), когда ILogin () выполняется отдельно, т.е. не через Logmein ().

Когда я запускаю Logmein () с кодом в текущей форме, ничего не происходит, т.е. не возникает ошибка исключения.

Когда я использую task.Wait (); возникает исключение / ошибка, связанная с ожиданием. Я постараюсь предоставить подробную информацию об исключении.

Мой код здесь

    private void Logmein()
     {

             var task = Task.Run(async () => { await Ilogin(); });// Nothing happens by this code
             //task.Wait(); It gives error/Exception.}
private static async Task Ilogin()
    {

        // Rest of the code is right (TESTED)
        Microsoft.WindowsAzure.Storage.Table.CloudTable table = tableClient.GetTableReference("user");

        Entry uname = new Entry();
        Entry pword = new Entry();
        Label linfo = new Label();
        string userid = uname.Text.ToString();
        string passcode = pword.Text.ToString();
        Reg signuser = new Reg(userid);
        TableOperation retrieveOperation = TableOperation.Retrieve<Reg>("regform", userid);
        TableResult retrievedResult = await tbl.ExecuteAsync(retrieveOperation); //This AWAIT is making trouble
        Reg loginuser = (Reg)retrievedResult.Result;
        string u1 = loginuser.username.ToString();
        string p1 = loginuser.password.ToString();

        if (u1 == userid && p1 == passcode)
        {
            linfo.Text = "Login Successful";
            //await Navigation.PushAsync(new MainPage());
        }
        else
        {
            linfo.Text = "Invalid Username or Password";
        }
    }

// here is my exception handling code

catch (Exception ex)
         {
             linfo.Text = "login Login Error" + ex.Message + ex.StackTrace + ex.HelpLink + ex.Source;
         }

СПАСИБО заранее.

1 Ответ

0 голосов
/ 01 июля 2018

Либо идти асинхронно до конца, либо синхронно до конца. Старайтесь не смешивать два.

Task Ilogin() - это асинхронный метод, в то время как void Logmein() не

это нужно сделать асинхронным, а затем ждать

private async Task Logmein() {
    await Ilogin();
}

Нет необходимости в методах Task.Run с огнем и забывать, поскольку их исключение не может быть перехвачено. Кроме того, блокирующие вызовы, такие как Task.Wait() и Task.Result, могут привести к тупикам.

если нужно вызвать Logmein(), попробуйте поместить его в обработчик событий, который позволит async void, чтобы его можно было ожидать.

private async void SomeHandler(object sender, EventArgs args) {
    await Logmein();
}

Если это так, вы можете избежать Logmein() и ждать Ilogin() напрямую.

Ссылка Async / Await - Лучшие практики асинхронного программирования

...