2016-09-16 22 views
0

我添加了運行存儲過程的儀表板devexpress,並且它需要很長時間。所以,我在form_load開始線程返回System.InvalidOperationException:當前的SynchronizationContext不能用作TaskScheduler

public void LoadDashboard() 
{ 
    using (Stream s = new MemoryStream(Encoding.Default.GetBytes(Resource.Dashboard.MaterialDashboard1))) 
    { 
     s.Position = 0; 
     dashboardViewer1.LoadDashboard(s); 
    } 
} 

private void frmMaterialDashboard_Load(object sender, EventArgs e) 
{ 
    Thread newth=new Thread(LoadDashboard); 
    newth.Start(); 

    int UserId = int.Parse(Configuration.AccountDetail.UserId.ToString()); 
    lblUserName.Caption = _userRepository.Get().Where(i => i.Id == UserId).First().FullName; 

    alertControl1.Show(this, "Welcome","Welcome to SPMS Mr."+_userRepository.FindById(Configuration.AccountDetail.UserId).First().FullName +"\n Server time:"+DateTime.Now); 
} 

創建了一個簡單的線程在我的應用程序但是當我運行我的應用程序我得到這個錯誤:

型「DevExpress.DashboardCommon.DashboardInternalException」發生在DevExpress的未處理的異常.Dashboard.v15.2.Win.dll

附加信息:內部錯誤。請聯繫應用程序供應商或您的系統管理員,並提供以下信息。

System.InvalidOperationException:當前的SynchronizationContext不能用作TaskScheduler。

在System.Threading.Tasks.SynchronizationContextTaskScheduler..ctor()
在DevExpress.DashboardWin.Native.WinDashboardService.RequestCustomizationServices(RequestCustomizationServicesEventArgs E)
在DevExpress.DashboardCommon.Service.DashboardService.DevExpress.DashboardCommon.Service。 IDashboardServiceAdminHandlers.OnRequestCustomizationServices(對象發件人,RequestCustomizationServicesEventArgs E)
在DevExpress.DashboardCommon.Server.DashboardSession.CreateDataLoaderParameters(ReloadDataArgs參數) 在DevExpress.DashboardCommon.Server.DashboardSession.CreateDataLoader(ReloadDataArgs參數)
在開發Express.DashboardCommon.Server.DashboardSession.LoadData(IEnumerable的1 dataSourceComponentNames, ReloadDataArgs args)
at DevExpress.DashboardCommon.Server.DashboardSession.ReloadData(IEnumerable
1 dataSourceComponentNames,ReloadDataArgs參數)
在DevExpress.DashboardCommon.Server.DashboardSession.Initialize(DashboardSessionState狀態,布爾isDesignMode)
在DevExpress.DashboardCommon.Service.DashboardServiceOperation`1。執行(DashboardServiceResult結果)

更新

我改變這樣的代碼,它的工作原理沒有任何錯誤和數據顯示,但沒有任何異步操作,我不得不等待加載DAT一個

public async Task<Stream> LoadDashboard() 
{ 
    Stream s = new MemoryStream(Encoding.Default.GetBytes(Resource.Dashboard)); 
    s.Position = 0; 
    return s; 
} 

private async void frmMaterialDashboard_Load(object sender, EventArgs e) 
{ 
    Stream dashboardData = await LoadDashboard(); 
    dashboardViewer1.LoadDashboard(dashboardData); 

    int UserId = int.Parse(Configuration.AccountDetail.UserId.ToString()); 
    lblUserName.Caption = _userRepository.Get().Where(i => i.Id == UserId).First().FullName; 
    alertControl1.Show(this, "Welcome","Welcome to SPMS Mr."+_userRepository.FindById(Configuration.AccountDetail.UserId).First().FullName +"\n Server time:"+DateTime.Now); 
} 
+0

Gotcha - nvrmind ...感謝您的更新信息。 –

+0

@ShannonHolsinger我只是在我的應用程序中有這個線程 –

+0

是的,我對這個名字空間看起來像一個UI「東西」(控件,不管),如果你在一個單獨的線程上運行會遇到問題。您是否嘗試過在UI線程上運行它以獲得樂趣和冒險? –

回答

3

沒有問題的完整環境,我不能給你一個確切的解決方案,但總體來說,你不能從另一個線程訪問UI元素。這意味着您需要在另一個線程上執行所有請求和計算,然後更新UI線程上的UI元素。考慮這樣簡化的解決方案,不明確啓動一個新線程:

// event on UI thread  
private async void frmMaterialDashboard_Load(object sender, EventArgs e) 
{ 
    var dashboardData = await LoadDashboardDataFromDatabaseAsync(); 
    dashboardViewer1.Load(dashboardData); 
} 

public async Task<DashboardData> LoadDashboardDataFromDatabaseAsync() 
{ 
    string query = "..."; 
    var queryResult = await db.ExucuteQueryAsync(query).ConfigureAwait(false); 
    return ConvertQueryRequltToDashboardData(queryResult); 
} 
+0

我改變了我的代碼,我實現了你的解決方案,我的代碼運行時沒有任何錯誤,但加載仍然存在,我認爲異步函數不叫async –

+0

如果你有一個同步數據庫調用,你能看到我更新的 –

+0

應該將它包裝到一個任務:'var queryResult = await Task.Run((=)db.Execute(query))。ConfigureAwait(false);' –

相關問題