使用 c# 从 Azure 存储帐户表中检索记录,同时使用 xamarin 开发跨平台应用程序给出错误

Posted

技术标签:

【中文标题】使用 c# 从 Azure 存储帐户表中检索记录,同时使用 xamarin 开发跨平台应用程序给出错误【英文标题】:Retrieving records from Azure Storage account table using c# while developing cross platform app using xamarin giving error 【发布时间】:2018-12-09 15:11:44 【问题描述】:

使用 c# 从 Azure 存储帐户表中检索记录,同时使用 xamarin 开发跨平台应用程序时出现错误。

await tbl.ExecuteAsync(retrieveOperation);

I AM FOLLOWING THIS LINK!

当 ILogin() 单独执行时,即不通过 Logmein(),此代码给出异常(时间等待和异步错误使用 storageexception)。

当我使用当前形式的代码运行 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;
         

提前致谢。

【问题讨论】:

什么错误?在哪条线上?不幸的是,正如所写,没有具体的工作;他们需要有人加载/运行您的代码才能看到错误。请编辑具体。 发布错误详情,可能还有await tbl.ExecuteAsync&lt;TableResult&gt;(retrieveOperation); //task.Wait();它给出错误/异常。请参阅在线#2 Panveet_Singh 是的。我认为这条线因为“等待”而制造麻烦 David Makogon,我用 try/catch 测试过很多次。运行此代码没有任何反应。 【参考方案1】:

要么一直异步,要么一直同步。尽量避免将两者混为一谈。

Task Ilogin() 是异步方法,而 void Logmein() 不是

它应该是异步的,然后等待

private async Task Logmein() 
    await Ilogin();

不需要Task.Run with fire and forget 方法,因为它们的异常无法被捕获。此外,像 Task.Wait()Task.Result 这样的阻塞调用可能会导致死锁。

如果需要调用Logmein(),请尝试将其放入事件处理程序中,这样就可以等待async void

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

如果是这种情况,您可以避免 Logmein() 并直接等待 Ilogin()

参考Async/Await - Best Practices in Asynchronous Programming

【讨论】:

谢谢 Nkosi,我要试试这个。是的,我想把它放在事件处理程序下。

以上是关于使用 c# 从 Azure 存储帐户表中检索记录,同时使用 xamarin 开发跨平台应用程序给出错误的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用托管标识从 C# 控制台代码连接 Azure 文件共享(存储帐户)

如何使用 c# 从 azure blob 存储中检索 xml 文件

如何使用 JavaScript v12 SDK for Browsers 检索和显示(在浏览器中)存储在 Azure 存储帐户中的多个 pdf 的 URL

Azure CLI - 如何从帐户密钥中找到可用的“端点”?

在 Azure 存储帐户表中存储 API 密钥/密码

从 Azure 表存储中获取 1000 多个数据集