2016-09-16 13 views
0

ストアドプロシージャを実行するダッシュボードdevexpressを追加すると時間がかかります。だから私はform_loadStart thread returns 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として使用されていない可能性があります。 DevExpress.DashboardCommon.Service.DashboardService.DevExpress.DashboardCommon.Serviceで

System.Threading.Tasks.SynchronizationContextTaskScheduler..ctorで

DevExpress.DashboardWin.Native.WinDashboardService.RequestCustomizationServicesで()
(RequestCustomizationServicesEventArgs電子)
。 IDashboardServiceAdminHandlers.OnRequestCustomizationServices(オブジェクト送信者、RequestCustomizationServicesEventArgs E)DevExpress.DashboardCommon.Server.DashboardSession.CreateDataLoaderでDevExpress.DashboardCommon.Server.DashboardSession.CreateDataLoaderParameters(ReloadDataArgsの引数)で
(ReloadDataArgsの引数)
のDevでDevExpress.DashboardCommon.Service.DashboardServiceOperation`1で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)で

が、私はこのように私のコードを変更

を更新し、それがエラーなしで動作し、データが示されているが、どの非同期操作なしで、私はDATをロードするために待たなければならない(DashboardServiceResult結果)を実行a

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

ガッチャ:明示的に新しいスレッドを起動しないように簡略化ソリューションを考えてみましょう。 –

+0

@ShannonHolsinger私はちょうど私のアプリケーションでこのスレッドを持っています –

+0

ええ、私はその名前空間について知っている何かは、UIの "もの"(コントロール、何でも)のように見える、別のスレッドで実行する場合に問題があるだろう。あなたは楽しい&冒険のためのUIスレッドでそれを実行しようとしましたか? –

答えて

3

問題の完全な説明なし正確な解決策はありませんが、全体的には別のスレッドからUI要素にアクセスすることはできません。つまり、別のスレッドですべてのリクエストと計算を行い、UIスレッドのUI要素を更新する必要があります。 ...更新情報をありがとうnvrmind -

// 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

自分のコードを変更して解決策を実装しましたが、エラーなしでコードが実行されていますが、読み込み中は非同期関数が非同期でないと思われます –

+0

同期データベース呼び出しがある場合は –

+0

、 ConfigureAwait(false); ' –

関連する問題