C# UI处理耗时操作

昨天过去系统部,解决一个性能的问题。在项目中遇到一个问题,在UI程序中增加timer, 间隔为2秒,结果在其中进行了比较耗时的操作,于是UI变得慢得难以忍受。
遇到这个问题,显然是不应该在依靠Window消息机制实现的定时器中处理费时的操作,首先分析了一下该操作的耗时,平均值1.6s,最大值大概在2.4s,于是准备采用异步调用机制来解决这个问题,显然可以采用BeginInvoke或者自己创建新的Thread来处理,但在查MSDN发现BackgroundWorker更为适合来处理这种情况。
BackgroundWorker可以启动后台线程来处理费时的操作并在操作完成后调用主线程的方法,显然这个也可以通过委托的异步调用机制来实现,不过使用BackgroundWorker会简化许多工作,使用起来非常方便, 它包括三个事件:DoWork,  ProcessChanged和RunWorkerCompleted, 调用BackgroundWorker.RunWorkerAsync会触发DoWork事件,异步调用完成后会触发RunWorkerCompleted事件,BackgroundWorker.ReportProgress会触发ProcessChanged事件,这样就可以非常简单解决面对的问题。
在Form中通过工具箱增加一个BackgrondWorker,然后增加DoWork的处理函数,在其中调用费时的操作,然后在timer的处理函数中使用BackgroundWorker的RunWorkerAsync方法,不过要注意的是一个worker不能同时调用两个RunWorkerAsync方法,所以在timer中需要增加IsBusy的判断,于是问题解决。

Leave a Reply