WPF:数据库更改时更新视图模型(并发问题)
WPF : Update View Model when DB Changes (Concurrency Issue)
我目前正在开发架构如下的 WPF 应用程序:
- MVVM
- 实体框架 4(使用 LINQ)。
- 汇集数据库以获取数据的 WCF 服务 (Oracle)。
- 我在视图模型中进行 WFC 调用 Class 并将数据放入 ObsevableCollections。
- Db 更改发生在另一个应用程序中。
所以我的应用程序不会对数据库执行任何写入操作(零),它只会读取数据并将其显示在 UI。
如何让我的应用程序快速响应数据库更改,我阅读了以下解决方案,但我很困惑,不知道该使用什么:
- 每 n 秒使用 DispatcherTimer 池化数据库(似乎工作太多导致数据每毫秒更改一次)
- SqlDependency,在整个 Internet 上进行了搜索,但未找到使用 EF 的正确实现。
正如我所说,数据库每毫秒更改一次(来自其他来源的财务数据),
如何解决这个问题?
谢谢。
我尝试了下面的代码,目前它似乎工作正常(但我仍然对无限循环有一些疑问),请告诉我你的意思:
public class MyViewModel
{
BackgroundWorker _bgWorker ;
//some props
//some funcs
protected internal MyViewModel(Session session)
{
Session = session;
RefreshData();
}
protected void RefreshData()
{
try
{
_bgWorker = new BackgroundWorker
{
WorkerReportsProgress = true,
WorkerSupportsCancellation = true
};
_bgWorker.DoWork += bgDoWork;
if (!_bgWorker.IsBusy)
{
_bgWorker.RunWorkerAsync();
}
}
catch (Exception)
{
_bgWorker.CancelAsync();
}
}
private void bgDoWork(object sender, DoWorkEventArgs e)
{
var worker = (BackgroundWorker)sender;
while (!worker.CancellationPending)
{
//Thread.Sleep(1000); should i keep this or not ?
Proxy(); // WCF calls
}
}
}
我目前正在开发架构如下的 WPF 应用程序:
- MVVM
- 实体框架 4(使用 LINQ)。
- 汇集数据库以获取数据的 WCF 服务 (Oracle)。
- 我在视图模型中进行 WFC 调用 Class 并将数据放入 ObsevableCollections。
- Db 更改发生在另一个应用程序中。
所以我的应用程序不会对数据库执行任何写入操作(零),它只会读取数据并将其显示在 UI。
如何让我的应用程序快速响应数据库更改,我阅读了以下解决方案,但我很困惑,不知道该使用什么:
- 每 n 秒使用 DispatcherTimer 池化数据库(似乎工作太多导致数据每毫秒更改一次)
- SqlDependency,在整个 Internet 上进行了搜索,但未找到使用 EF 的正确实现。
正如我所说,数据库每毫秒更改一次(来自其他来源的财务数据),
如何解决这个问题?
谢谢。
我尝试了下面的代码,目前它似乎工作正常(但我仍然对无限循环有一些疑问),请告诉我你的意思:
public class MyViewModel
{
BackgroundWorker _bgWorker ;
//some props
//some funcs
protected internal MyViewModel(Session session)
{
Session = session;
RefreshData();
}
protected void RefreshData()
{
try
{
_bgWorker = new BackgroundWorker
{
WorkerReportsProgress = true,
WorkerSupportsCancellation = true
};
_bgWorker.DoWork += bgDoWork;
if (!_bgWorker.IsBusy)
{
_bgWorker.RunWorkerAsync();
}
}
catch (Exception)
{
_bgWorker.CancelAsync();
}
}
private void bgDoWork(object sender, DoWorkEventArgs e)
{
var worker = (BackgroundWorker)sender;
while (!worker.CancellationPending)
{
//Thread.Sleep(1000); should i keep this or not ?
Proxy(); // WCF calls
}
}
}