我对任务不熟悉,并不知道以我想要的方式使用它是否有用。
我有一个继承自TextBlock并为文本着色的Class(Syntaxhighlighting)。 它确实需要一段时间,所以我想在背景中做到这一点
到目前为止,这是我的代码:
async void SyntaxTextBlock_TargetUpdated(object sender, System.Windows.Data.DataTransferEventArgs e)
{
if ((clientSettings.SyntaxCheck || clientSettings.SyntaxHighlighting) && !string.IsNullOrEmpty(Text))
{
string value = Text;
Syntax syntax = await Task.Factory.StartNew(() => DoSyntax(value));
Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() =>
{
if (syntax.IsTextDecoration)
TextDecorations.Add(Syntax.TextDecoration);
ToolTip = string.Join(Environment.NewLine, syntax.Messages);
Text = null;
foreach (Run run in syntax.Runs)
Inlines.Add(run);
}));
}
}
我的问题是我无法访问syntax.Runs
返回的对象Syntax
中的DoSyntax(value)
列表。
错误:the calling thread cannot access this object because a different thread owns it
我使用调度程序TaskScheduler.FromCurrentSynchronizationContext
尝试了它并且它有效,但GUI已冻结。
当gui不冻结时,有没有办法在多个不同的线程上执行此操作?
答案 0 :(得分:1)
问题是DoSyntax
在后台线程上创建线程仿射对象(特别是Syntax
)。
您需要更改DoSyntax
,以便它只会创建"正常"后台线程上的对象(如带有颜色/语义的范围列表),然后让您的UI线程处理并在必要时创建实际的Syntax
类型。