2012-04-24 120 views
1

有没有办法做这样的事情?Silverlight触发一个事件,然后再触发另一个事件

背景: 我点了一个按钮。点击按钮时,我尝试显示“加载”消息,运行一些执行一些UI工作的代码,然后解除“加载”消息。通常需要几秒到20秒的时间。目前加载消息根本不显示,并且UI冻结,直到完成按钮点击中的代码。

我已阅读关于Background Worker和调度程序,但一直未能得到它的工作。我不确定是否因为按钮点击中的代码调用了各种其他代码(包括第三方的东西),但是我无法使其正确运行。这一切仍然有效,但它仍冻结了用户界面,并且不显示加载消息。

所以,我想知道是否有另一种解决方法。是否可以进行设置,以便在按钮上单击我只显示加载消息,然后稍后再启动另一个执行我长时间运行的进程的事件?这样用户界面仍然会冻结几秒钟,但至少会显示“加载”消息。

+0

使用BackgroundWorker和你的问题都将解决没有UI冻结。你遇到了什么问题? BackgroundWorker的重要技巧是在调用UI元素上的方法时,必须使用Dispatcher.Invoke()。 – 2012-04-24 22:50:01

+0

我不太确定。我使用了BackgroundWorker和Dispatcher,应用程序按照通常的方式工作,包括点击按钮后仍冻结整个应用程序。这个问题甚至可能不是线程或UI相关的。也许这个过程需要很长时间才能完成。当发生这种情况时,我看到我的CPU达到了50%,这通常不会发生,除非发生了一些大事。 – dtc 2012-04-24 23:58:19

+0

听起来像对图表元素本身的调用很慢。 System.Threading.Timer是你正在寻找的。 – 2012-04-25 00:31:12

回答

1

您应该可以通过拨打Dispatcher.BeginInvoke来完成此操作。

private void ButtonClick(object sender, EventArgs e) 
{ 
    ShowMyLoadingMessage(); // your code, not sure what it is 
    Dispatcher.BeginInvoke(() => 
    { 
     CallMyLongRunningCode(); // again, not sure what this is 
     HideMyLoadingMessage(); 
    } 
} 

我不认为这是最好的解决方案,因为它在UI线程上运行,但它应该做你所要求的。

什么是长时间运行的代码需要20秒?

+0

此代码运行正常,但不会缓解问题。当我点击确定按钮时,它仍会冻结整个应用程序,直到过程完成,并且我的加载指示符也不会显示出来。长时间运行的代码使用第三方库从数据创建图表。 – dtc 2012-04-25 00:04:51

+0

是的,当你描述这个问题时,我很害怕。长时间运行的代码是获取图表的数据还是只是建立图表? – Bryant 2012-04-25 00:23:24

+0

它使用已从数据库中检索的数据。然后根据数据构建图表。据我所知,它可以根据它的数据从头开始构建图表。但是,之后的代码我并不太熟悉,这就是为什么我正在寻找一个更快的解决方案,以便在屏幕冻结时至少显示加载指示符。 – dtc 2012-04-25 00:29:08