Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从不同的线程任务访问对象_C#_Multithreading_Asynchronous_Task - Fatal编程技术网

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

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

我是个新手,不知道用我想要的方式使用它是否好

我有一个从TextBlock继承的类,它将文本着色(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);

        }));
    }
}
我的问题是无法访问
语法。从
DoSyntax(value)
返回的对象
语法运行
列表

错误:
调用线程无法访问此对象,因为其他线程拥有它

我用调度器
TaskScheduler.FromCurrentSynchronizationContext
尝试了它,它成功了,但是GUI冻结了


在gui不冻结的情况下,有没有办法在多个不同的线程上执行此操作?

问题是,
DoSyntax
在后台线程上创建线程仿射对象(特别是
语法


您需要更改
DoSyntax
,使其仅在背景线程上创建“普通”对象(如带有颜色/语义的范围列表),然后让UI线程处理该对象,并在必要时创建实际的
语法
类型。

您的错误可能与此类似:如您所见,可能重复,我已经实现了一个Dispatcher.Invoke callI think,根本问题是在非UI线程中创建一个
语法
对象。我看不出有任何理由在这里使用
Dispatcher.BeginInvoke
,因为在
wait
之后,您已经在UI线程上了