问题是这个电话:
List<Analyser.ALARM_GROUP> alarmGroupList = analysertask.Result;
阻止UI线程,直到后台任务完成。
处理这个的方法是 用一个 继续任务 而不是等待结果:
Task<List<Analyser.ALARM_GROUP>> analysertask = Task.Factory.StartNew<List<Analyser.ALARM_GROUP>>( ()=> { // Keep existing code return Analyser1.startAnalysis(PlantModelReader1, AlarmlogReader1, RuleBaseLoader1, AlarmList1); }); // Make a continuation here... analysertask.ContinueWith( t => { Cursor = Cursors.Wait; List<Analyser.ALARM_GROUP> alarmGroupList = t.Result; showAlarmLog(alarmGroupList); Cursor = Cursors.Arrow; }, TaskScheduler.FromCurrentSynchronizationContext());
通过将其安排为延续,它将运行 当第一个任务完成时 。通过使用 TaskScheduler.FromCurrentSynchronizationContext ,你说要在执行时将其编组回UI线程。
TaskScheduler.FromCurrentSynchronizationContext
请注意,使用.NET 4.5 / C#5会变得更加容易。使用C#5,您可以将其写为:
var analysertask = Task.Run( ()=> { // Keep existing code return Analyser1.startAnalysis(PlantModelReader1, AlarmlogReader1, RuleBaseLoader1, AlarmList1); }); Cursor = Cursors.Wait; List<Analyser.ALARM_GROUP> alarmGroupList = await analysertask; showAlarmLog(alarmGroupList); Cursor = Cursors.Arrow;
这要求方法本身用新标记 async 但是,关键字。
async