繁体   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