我正在使用显示警报进行简单的是或否对话,但这冻结了我的UI,我也不知道为什么。
private async void BtnDeleteStockTake_Clicked(object sender, EventArgs e)
{
var selectedItem = gridItems.SelectedItem as StockTakeTransArgsSage;
var action = await DisplayAlert("First 1", "Are you sure you wish to delete Stock Take", "Yes", "No");
if (action)
{
StockTakeTransArgsSage _item = new StockTakeTransArgsSage();
_item =database.GetSingleStockTake(selectedItem.StockTakeId).Result;
_item.Quantity = decimal.Parse(txtQty.Text);
int updated = await database.DeleteStockTake(_item);
await DisplayAlert("Second 1", "Stock Take Deleted", "OK");
await RebindData();
}
}
奇怪的事情,以及第一个警告的显示警告,都不会消失
这会导致UI崩溃并出现致命错误,但是如果我正常执行代码而没有显示警报,那很好,它确实会显示警报,然后冻结。
我的删除库存功能
public async Task<int> DeleteStockTake(StockTakeTransArgsSage args)
{
return await database.DeleteAsync(args);
}
“我的单身”功能。
public async Task<StockTakeTransArgsSage> GetSingleStockTake(int ID)
{
StockTakeTransArgsSage _stocktake = new StockTakeTransArgsSage();
_stocktake = await database.Table<StockTakeTransArgsSage>().Where(w => w.StockTakeId == ID).FirstOrDefaultAsync();
return _stocktake;
}
答案 0 :(得分:1)
很有可能是由于您描述的行为(并查看代码),听起来像是因为Display Alert未在UI线程上运行,这导致应用程序等待您关闭此警报框在能够做任何事情之前。因此,您的应用程序不会崩溃或死机,它只是在其他线程上启动警报。 因此,将其更改为以下内容:
Device.BeginInvokeOnMainThread(() =>
{
DisplayAlert("Second 1", "Stock Take Deleted", "OK");
});
让我知道这是否合理。
答案 1 :(得分:0)
您是否尝试过等待
StockTakeTransArgsSage _item = new StockTakeTransArgsSage();
_item = await database.GetSingleStockTake(selectedItem.StockTakeId);
_item.Quantity = decimal.Parse(txtQty.Text);
如我所见,这将起作用。还要确保在完成该过程之前,您不要触摸屏幕上的任何其他UI组件。
答案 2 :(得分:-1)
在您的代码中,只有那些行会导致该行为:
StockTakeTransArgsSage _item = new StockTakeTransArgsSage();
_item =database.GetSingleStockTake(selectedItem.StockTakeId).Result;
_item.Quantity = decimal.Parse(txtQty.Text);
int updated = await database.DeleteStockTake(_item);
这些行不能在不冻结一段时间的情况下在UI线程上执行。这可能会导致崩溃,您没有提供任何有关崩溃输出中看到的信息,因此这是唯一可能的解释。