等待事件.如何不冻结 gui

本文关键字:冻结 gui 何不 事件 等待 | 更新日期: 2023-09-27 17:55:41

您好,我有以下问题。我需要类似"锁定"的东西来让我的程序等待事件。我有一些基于事件的数据库访问权限。因此,如果我想从 db 获取一些东西并在其上做一些事情,我正在编写:

void getData()
{
    ...
    ...
    getMyDataFromDbPlease();
}
void responseEvent(parameters...)
{
    //Ok i have my data, now i do something on it
    ...
    ...
}

因此,如果我有大的逻辑,我必须将其分成两部分。如果我想在一个藻类中获取 5 次数据,我必须将其分成 6 个部分。

所以我想得到这样的东西:

void getData()
{
    ...
    ...
    getMyDataFromDbPlease();
    //somehow wait for data here
    getMyDataFromDbPlease();
    ...
    ...
}

但是我希望这个魔法等待不会冻结我的 GUI。我怎样才能实现呢?我在 wpf 工作。

等待事件.如何不冻结 gui

可以使用后台任务将调用连接到数据库,然后在 UI 线程上调度实际更新:

// create a background task to load data without blocking the UI
Task.Factory.StartNew(() =>
{
  var data = getData(); // call to DB or whatever
  // invoke user code on the main UI thread
  Dispatcher.Invoke(new Action(() =>
  {
    doSomethingWithData();
  }));
});

尝试将代码放在单独的线程中。但不要忘记,您必须使用 Dispatcher.Invoke() 来访问 GUI。或者,您可以将 GUI 绑定到在单独线程中更改的变量。