2013-06-02 33 views
0

我想实现异步等待到我的应用程序,我遇到了一些困难十字UI线程异步与无效操作等待

那看起来容易但它不工作了这样。我有下面的代码,我将通过等待LoadAsync将执行WCF服务调用并返回数据,然后我可以加载任务窗体。然而,在等待呼叫时,我在任务表单的实例化过程中遇到了跨UI线程异常。如果我删除等待,那么它的作品。我究竟做错了什么?

if (!Core.Tasks.IsLoaded) 
{ 
await Core.Tasks.LoadAsync(); 
} 
Core.ShowWait("Opening Tasks"); 
TasksForm frm = new TasksForm() { MdiParent = Core.MainMDIWindow, CurrentViewName = Core.CurrentUser.UserProfile.TasksLastViewName }; // <-- error on this line 

的LoadAsync方法是:

public override Task LoadAsync(bool includeDeleted = false) 
{ 
    return Task.Run(async() => 
    { 
     Core.Logger.EnterMethod("_TasksData.Load"); 
     try 
     { 
      DataSet = Core.LogbookProData.Tasks.GetTasks(DataUserID, includeDeleted); 
      LoadCompleted(); 
      dsTasks cacheData = await Cache.LoadAsync(ConvertTimeZone); 
      if (cacheData != null) 
       MergeDataSets(DataSet, cacheData); 

      InitializeLayouts(); 
     } 
     catch (Exception ex) 
     { 
      Core.Logger.LogException("_TasksData.Load", ex); 
     } 
     finally 
     { 
      Core.Logger.LeaveMethod("_TasksData.Load"); 
     } 
    }); 
} 

回答

2

不能从后台线程访问任何UI对象。 Task.Run在后台线程上执行它的委托,所以如果在访问UI的Task.Run委托中有任何内容(例如,InitializeLayouts听起来可疑),那么你会得到这样的异常。

Task.Run实际上只有在您有CPU限制的操作时才会使用,或者您只有一个阻塞API,以便使用shoud作为异步调用。这不是通常用于实现async方法。你可能会发现我的async/await intro post helpful

例如,如果GetTasksMergeDataSets不会阻止太长,你可以实现LoadAsync这样的:

public override async Task LoadAsync(bool includeDeleted = false) 
{ 
    Core.Logger.EnterMethod("_TasksData.Load"); 
    try 
    { 
     DataSet = Core.LogbookProData.Tasks.GetTasks(DataUserID, includeDeleted); 
     LoadCompleted(); 
     dsTasks cacheData = await Cache.LoadAsync(ConvertTimeZone); 
     if (cacheData != null) 
      MergeDataSets(DataSet, cacheData); 

     InitializeLayouts(); 
    } 
    catch (Exception ex) 
    { 
     Core.Logger.LogException("_TasksData.Load", ex); 
    } 
    finally 
    { 
     Core.Logger.LeaveMethod("_TasksData.Load"); 
    } 
} 
+0

THX - 我试图消除Task.Run但并没有区别。非常难以追查的悲伤。 – Neal

+0

查看异常的堆栈跟踪。这应该给你一个很好的起点。 –