使用 c# 从 Azure 存储帐户表检索记录,同时使用 xamarin 开发跨平台应用程序,出现错误。
await tbl.ExecuteAsync(retrieveOperation);
当 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;
}
提前致谢。
最佳答案
要么一直异步,要么一直同步。尽量避免将两者混合。
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()
。
关于c# - 使用 c# 从 Azure 存储帐户表检索记录,同时使用 xamarin 开发跨平台应用程序给出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51118411/