从不同的线程访问对象 - 任务

时间:2016-09-08 11:23:40

标签: c# multithreading asynchronous task

我对任务不熟悉,并不知道以我想要的方式使用它是否有用。

我有一个继承自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不冻结时,有没有办法在多个不同的线程上执行此操作?

1 个答案:

答案 0 :(得分:1)

问题是DoSyntax在后​​台线程上创建线程仿射对象(特别是Syntax)。

您需要更改DoSyntax,以便它只会创建"正常"后台线程上的对象(如带有颜色/语义的范围列表),然后让您的UI线程处理并在必要时创建实际的Syntax类型。