[英]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.