gpt4 book ai didi

c# - Wpf 从数据库卡住 UI 中检索数据

转载 作者:太空宇宙 更新时间:2023-11-03 15:22:41 25 4
gpt4 key购买 nike

每次我获得 UI 锁定时,我在从数据库中异步检索数据时遇到问题。

private async void RetrieveHotlist(object sender, RoutedEventArgs e) //button click
{
var hotItems = new ObservableCollection<HotItem>();
await Task.Factory.StartNew(() =>
{

try
{
var serv = "xxx";
string connStr = Common.GetConStrEF(serv + "\\" + Common.DBLOGIN_INSTANCE,
Common.DBLOGIN_DBNAME, Common.DBLOGIN_USER, Common.DBLOGIN_PASSWORD);
var dataModel = new xxxxDataModel(connStr);

foreach (var category in dataModel.SpecialNumberCategory) //retrieving database CreateObjectSet<SpecialNumberCategory>("SpecialNumberCategory"); //ObjectContext
{
var item = new HotItem() { Name = category.Name };
hotItems.Add(item);
}

}
catch (Exception exception)
{
var baseException = exception.GetBaseException();
MessageBox.Show("Error\n\n" + exception.Message + "\n\n" + baseException.Message);
}

});
if (Settings != null)
{
Settings.Hotlist.Clear();
foreach (var hotItem in hotItems)
{
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => Settings.Hotlist.Add(hotItem)));
}
}
}

为什么 RetrieveHotlist 方法会锁定我的 UI?为什么等待 Task.Factory.StartNew() 还不够?

感谢您的帮助:)

编辑:

为了更清楚,我删除了一些代码。

private void RetrieveHotlist(object sender, RoutedEventArgs e) //button click
{
var b = new BackgroundWorker();
b.DoWork += (o, args) =>
{
Thread.Sleep(2000); //**UI IS FULL RESPONSIVE FOR 2 sec.**
var hotItems = new ObservableCollection<HotItem>();
try
{

var serv = "xxxx";
var dataModel = new xxxxDataModel(connStr);
var c = dataModel.SpecialNumberCategory; //**UI FREEZE / ENTITY FRAMEWORK**


b.RunWorkerCompleted += (o, args) =>
{

};
b.RunWorkerAsync();

}

编辑 2:感谢大家的帮助, Entity Framework 导致了这个问题(我现在不知道为什么)。

我用 SqlConnection 和 SqlCommand 替换了所有模型行。现在效果很好。

最佳答案

应在 UI 线程上调用与 UI 相关的代码。不要将它与您操作数据(发送、检索、更新等)的同一线程混合使用,以避免死锁。在你的情况下,它是由与数据库的交互引起的。

这是一个例子:

 Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => { 
/* Your code here */
MessageBox.Show("Error\n\n" + exception.Message + "\n\n" + baseException.Message);
}));

关于c# - Wpf 从数据库卡住 UI 中检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36639957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com