[英]The current SynchronizationContext may not be used as a 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(IEnumerable1 dataSourceComponentNames, ReloadDataArgs args)
at DevExpress.DashboardCommon.Server.DashboardSession.ReloadData(IEnumerable1 dataSourceComponentNames, ReloadDataArgs args)
at DevExpress.DashboardCommon.Server.DashboardSession.ReloadData(IEnumerable1 dataSourceComponentNames, ReloadDataArgs args)
1 dataSourceComponentNames,ReloadDataArgs args)
at DevExpress.DashboardCommon.Server.DashboardSession.ReloadData(IEnumerable
在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.