C# WPF必须在与DependencyObject相同的线程上创建DependencySource
我知道这个问题已经被问过很多次了,但我尝试了我找到的所有解决方案,没有人适合我 我有以下代码:C# WPF必须在与DependencyObject相同的线程上创建DependencySource,c#,wpf,C#,Wpf,我知道这个问题已经被问过很多次了,但我尝试了我找到的所有解决方案,没有人适合我 我有以下代码: public async void setFile(QuickBrowseFile file) { try { LoggingDatabaseService db = new LoggingDatabaseService(); LoggingData data = await db.getLoggingData(file.Id);
public async void setFile(QuickBrowseFile file) {
try {
LoggingDatabaseService db = new LoggingDatabaseService();
LoggingData data = await db.getLoggingData(file.Id);
db.close();
if (data != null) {
List<LoggingModel> loggingData = data.RowData;
int numRows = loggingData.Count;
Application.Current.Dispatcher.Invoke((Action)(delegate {
for (int i = 0; i < numRows; i++) {
LoggingModel m = loggingData[i];
treeView.Items.Add(m);//!!!!!!!!!!!!exception here
}
}));
}
} catch (Exception ex) {
Logger.error(ex);
}
}
public异步void setFile(QuickBrowseFile){
试一试{
LoggingDatabaseService db=新的LoggingDatabaseService();
LoggingData=await db.getLoggingData(file.Id);
db.close();
如果(数据!=null){
List loggingData=data.RowData;
int numRows=loggingData.Count;
Application.Current.Dispatcher.Invoke((操作)(委托{
对于(int i=0;i
我尝试了一种不同的解决方案,但问题是我有一个gif图像,它显示了使用来自的解决方案的一些帧
使用下面的代码不会引发任何异常,但会在加载时阻止gif图像
var uiContext = TaskScheduler.FromCurrentSynchronizationContext();
await Task.Factory.StartNew(() => {
LoggingDatabaseService db = new LoggingDatabaseService();
//Console.WriteLine(file.Id);
LoggingData data = db.getLoggingData(file.Id);
db.close();
if (data != null) {
List<LoggingModel> loggingData = data.RowData;
int numRows = loggingData.Count;
for (int i = 0; i < numRows; i++) {
treeView.Items.Add(loggingData[i]);
}
}
}, CancellationToken.None, TaskCreationOptions.None, uiContext);
var uiContext=TaskScheduler.FromCurrentSynchronizationContext();
等待任务。工厂。开始新建(()=>{
LoggingDatabaseService db=新的LoggingDatabaseService();
//Console.WriteLine(file.Id);
LoggingData=db.getLoggingData(file.Id);
db.close();
如果(数据!=null){
List loggingData=data.RowData;
int numRows=loggingData.Count;
对于(int i=0;i
您在第一个代码块上遇到的异常是什么?其:引发的异常:PresentationFramework.dll中的“System.Windows.Markup.XamlParseException”。其他信息:必须在与DependencyObject相同的线程上创建DependencySource。您可以尝试将同步上下文传递给Task.Factory.StartNew
likevar uiContext=TaskScheduler.FromCurrentSynchronizationContext();Task.Factory.StartNew(()=>{},CancellationToken.None,TaskCreationOptions.None,uiContext)代码>。任务是在后台线程上创建的,请查看这是否有帮助。为什么要将treeView.Items.Add(m)
移动到单独的工作线程?除非你的设计有缺陷,否则这不应该是你代码中缓慢的部分。你能在不访问外部数据的情况下修改你的代码来产生这种行为吗(可验证的示例)?您在第一个代码块上遇到的异常是什么?其:引发的异常:PresentationFramework.dll中的“System.Windows.Markup.XamlParseException”其他信息:必须在与DependencyObject相同的线程上创建DependencySource。您可以尝试将同步上下文传递到任务.Factory.StartNew
中var uiContext=TaskScheduler.FromCurrentSynchronizationContext();Task.Factory.StartNew(()=>{},CancellationToken.None,TaskCreationOptions.None,uiContext)代码>。任务是在后台线程上创建的,请查看这是否有帮助。为什么要将treeView.Items.Add(m)
移动到单独的工作线程?除非你的设计有缺陷,否则这不应该是你代码中缓慢的部分。你能在不访问外部数据的情况下修改你的代码来产生这种行为吗(可验证的例子)?