【发布时间】:2017-10-13 11:22:02
【问题描述】:
我的系统是这样工作的:
2 台计算机正在使用不同的应用程序但相同的数据库(表:订单)。
第一台计算机正在下订单并将其写入数据库, 第二台计算机需要每 5 秒显示一次新订单。
我将简要描述(以避免长文本)我需要实现什么以及我现在是如何做到的:
- 第二台计算机应用程序需要每 5 秒“进入数据库”以检查新订单并将其显示在屏幕上
当有很多订单并且我经常这样做时,我的应用程序会崩溃。
这就是我的应用程序现在的工作方式:
public MainWindow()
{
try
{
InitializeComponent();
this.WindowStartupLocation = WindowStartupLocation.CenterScreen;
this.WindowState = WindowState.Maximized;
//When app runs for first time get all orders
var ordersList = OrdersController.GetOrders();
collectionViewSource.Source = ordersList;
collectionViewSource.GroupDescriptions.Add(new PropertyGroupDescription("NumberOfOrder"));
DataContext = collectionViewSource;
//Here I'm refreshing screen every 5 seconds
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(5));
timer.Tick += timer_Tick;
timer.Start();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
void timer_Tick(object sender, EventArgs e)
{
//Every 5 seconds get all orders from database
var ordersList = OrdersController.GetOrders();
collectionViewSource.Source = null;
collectionViewSource.Source = ordersList;
DataContext = collectionViewSource;
}
GetOrders方法:
public static List<Orders> GetOrders()
{
DataServices.DB.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, DataServices.DB.Orders);
var results = DataServices.DB.proc_Orders_GetAll().ToList();
List<Orders> localOrders = new List<Orders>();
foreach (var item in results)
{
Orders local = new Orders();
local.Sender = item.Sender;
local.Quantity = Convert.ToDecimal(item.Quantity);
local.ArticleTitle = item.ArticleTitle;
local.DateOfOrder = Convert.ToDateTime(item.DateOfOrder);
lokalnen.Add(local);
}
return localOrders;
}
但是上面的代码不是很好,如果有很多订单,它会导致我的应用程序崩溃.. 可能是因为 UI 一直在渲染一次又一次
将这个“刷新作业”移动到另一个任务可能会解决这个问题,所以我尝试了这样的事情:
首先创建新方法RefreshScreen,它可能看起来像这样:
private void RefreshScreen()
{
var ordersList = OrdersController.GetOrders();
collectionViewSource.Source = null;
collectionViewSource.Source = ordersList;
DataContext = collectionViewSource;
}
我将这个 RefreshScreen() 移到了这样的新任务中:
void timer_Tick(object sender, EventArgs e)
{
//Instead old code where I set source of my list and of my datagrid directlly in timer tick now I moved it to new method and calling that method from a new task
Task.Factory.StartNew(() => RefreshScreen())
.ContinueWith(task =>
{
}, System.Threading.CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());
}
但这又让我的应用在一段时间后崩溃了…… 我真的不知道如何解决这个问题,也许是 Observablle 集合之类的东西, 我不知道...
任何形式的帮助都会很棒,可以防止我的应用崩溃! 谢谢!
编辑:从我的视觉工作室运行应用程序后,几秒钟后我得到了这个(解决方案包括计时器滴答中的任务):
【问题讨论】:
-
@mjwills 只是在一段时间后弹出消息并显示一些错误,然后单击确定应用程序关闭。我意识到如果我在刷新过程中单击 UI 上的某个位置,就会发生这种情况..
-
@mjwills 我会尽量让这个错误发生,所以我可能会告诉你,但它并没有一直出现,但我知道一直在发生什么:应用程序很慢,因为经常刷新/渲染 UI 我猜...
-
应用程序如何崩溃?它只是挂起还是您遇到异常?异常消息说明了什么?
-
如果应用程序崩溃并弹出窗口 - 转到 windows 事件查看器并找到相应的事件,其中将包含有关崩溃源的更多信息。
-
@mm8 就像 Application.exe 停止工作 Windows 可以在线检查问题的解决方案...关闭应用程序...例如,如果我单击其他按钮来检查其他内容应用程序变慢了,因为它可能在那个时候刷新(将源设置为我的数据网格)有没有办法以某种方式解决这个问题?
标签: c# wpf xaml user-interface task