gpt4 book ai didi

mysql - 防止锁定 UI 线程

转载 作者:行者123 更新时间:2023-11-29 04:38:32 24 4
gpt4 key购买 nike

我的主页上有一个 DataGrid,里面全是 Employees。每个 Employee 都有一个“在”状态 - 这会根据 Employee 当前是否在建筑物中进行修改。

我需要持续更新此 DataGrid,因为人们会在一整天内进出建筑物。这意味着我将每隔 1-5 秒发送一次 MySQL 查询,直到用户点击按钮导航到另一个页面。

我已经尝试了最简单和明显的解决方案,一个 While 循环但是这会卡住并锁定 UI。如何在不锁定 UI 的情况下创建运行和查询 MySQL 的循环?

编辑:尝试回答

        public void PeriodicCall()
{
var employeeDS = new EmployeeDataService();
int i = 1;
Timer timer = new Timer(
state => {
Employees = employeeDS.HandleEmployeeSelect();
FilteredView = CollectionViewSource.GetDefaultView(Employees);
Application.Current.Dispatcher.BeginInvoke(new Action(() => {
dataGrid.ItemsSource = FilteredView;
testLabel.Content = "Who's Who " + i;
i++;
}));
},
null, //no object as Callback parameter
TimeSpan.FromSeconds(0), //start in x millisec
TimeSpan.FromSeconds(1)); //time between call
}

最佳答案

您可以使用 Backgroundworker, Hook 到它的 .completed 并在那里渲染(使用

BackgroundWoker worker = new BackgroundWorker();
worker.DoWork += functioToDo
worker.Completed += functionWhere you update the UI
worker.runAsynchronous(); //actually starts the thread

在更新 UI 的函数中不要忘记使用调度程序访问 UI 线程:

dispatcher.invoke((Action) delegate { here your code})

访问其他地方的 UI 线程。

其他更酷的方法是处理 propertyChanged 并将更改绑定(bind)到 UI。但这有点复杂,我不知道细节。

您可以使用计时器每隔几秒启动一次。

第三种方法是在更新数据库时使用触发器。我们需要更多详细信息才能知道如何附加到那里。但是从那里您也可以在 UI 中调用一些更新,然后您不需要使用 CPU 每秒检查一次(您知道,通过中断而不是轮询来工作)。

关于mysql - 防止锁定 UI 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35269127/

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