2013-06-02 135 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

查看異常的堆棧跟蹤。這應該給你一個很好的起點。 –