C# 从不同的线程任务访问对象
我是个新手,不知道用我想要的方式使用它是否好 我有一个从TextBlock继承的类,它将文本着色(Syntaxhighlighting)。 这确实需要一段时间,所以我想在后台做 以下是我目前的代码:C# 从不同的线程任务访问对象,c#,multithreading,asynchronous,task,C#,Multithreading,Asynchronous,Task,我是个新手,不知道用我想要的方式使用它是否好 我有一个从TextBlock继承的类,它将文本着色(Syntaxhighlighting)。 这确实需要一段时间,所以我想在后台做 以下是我目前的代码: async void SyntaxTextBlock_TargetUpdated(object sender, System.Windows.Data.DataTransferEventArgs e) { if ((clientSettings.SyntaxCheck || clientSe
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);
}));
}
}
我的问题是无法访问语法。从DoSyntax(value)
返回的对象语法运行列表
错误:调用线程无法访问此对象,因为其他线程拥有它
我用调度器TaskScheduler.FromCurrentSynchronizationContext
尝试了它,它成功了,但是GUI冻结了
在gui不冻结的情况下,有没有办法在多个不同的线程上执行此操作?问题是,DoSyntax
在后台线程上创建线程仿射对象(特别是语法
)
您需要更改DoSyntax
,使其仅在背景线程上创建“普通”对象(如带有颜色/语义的范围列表),然后让UI线程处理该对象,并在必要时创建实际的语法
类型。您的错误可能与此类似:如您所见,可能重复,我已经实现了一个Dispatcher.Invoke callI think,根本问题是在非UI线程中创建一个语法对象。我看不出有任何理由在这里使用Dispatcher.BeginInvoke
,因为在wait
之后,您已经在UI线程上了