簡體   English   中英

啟動線程返回System.InvalidOperationException:當前的SynchronizationContext不能用作TaskScheduler

[英]Start thread returns System.InvalidOperationException: The current SynchronizationContext may not be used as a TaskScheduler

我添加了一個儀表板devexpress來運行存儲過程,並且需要很長時間。 所以我在form_load應用程序中創建了一個簡單的線程

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.Dashboard.v15.2.Win.dll中發生了類型為'DevExpress.DashboardCommon.DashboardInternalException'的未處理異常

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

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.CreateDataLoadsParameters(ReloadDataArgs args)在DevExpress.DashboardCommon.Server.DashboardSession.CreateDataLoader(ReloadDataArgs args)
在DevExpress.DashboardCommon.Server.DashboardSession.LoadData(IEnumerable 1 dataSourceComponentNames, ReloadDataArgs args)
at DevExpress.DashboardCommon.Server.DashboardSession.ReloadData(IEnumerable
1 dataSourceComponentNames, ReloadDataArgs args)
at DevExpress.DashboardCommon.Server.DashboardSession.ReloadData(IEnumerable
1 dataSourceComponentNames, ReloadDataArgs args)
at DevExpress.DashboardCommon.Server.DashboardSession.ReloadData(IEnumerable
1 dataSourceComponentNames,ReloadDataArgs args)

在DevExpress.DashboardCommon.Server.DashboardSession.Initialize(DashboardSessionState狀態,布爾值isDesignMode)
在DevExpress.DashboardCommon.Service.DashboardServiceOperation`1.Execute(DashboardServiceResult結果)

更新

我像這樣更改我的代碼,它可以正常工作且沒有任何錯誤,並且顯示了數據,但沒有任何異步操作,我必須等待加載數據

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);
}

沒有問題的完整上下文,我無法為您提供確切的解決方案,但是總的來說,您無法從另一個線程訪問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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM