2016-09-08 6 views
1

私はタスクを初めて経験しています。本当に使い方が分かりません。別のスレッドからオブジェクトにアクセスする - タスク

私は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)によって返されたオブジェクトSyntaxからsyntax.Runsリストにアクセスカントで​​す。

エラー:the calling thread cannot access this object because a different thread owns it

私は、スケジューラTaskScheduler.FromCurrentSynchronizationContextでそれを試してみました、それが働いたが、GUIがフリーズ。

guiがフリーズしていない間に複数の異なるスレッドでこれを行う方法はありますか?

+0

あなたはこのエラーに似ている可能性があります:http://stackoverflow.com/questions/9732709/the-calling-thread-cannot-access-this-object-because-a-different-thread-owns-it –

+0

可能性のある[.NETの異なるスレッド間で共有されているリスト]の重複の可能性があります。ご覧のとおり、私は既に実装しています(http://stackoverflow.com/questions/4011031/list-shared-different-threads-in-net) –

+0

Dispatcher.Invoke call –

答えて

1

DoSyntaxは、バックグラウンドスレッドでスレッドアファインオブジェクト(具体的にはSyntax)を作成しています。

DoSyntaxを変更して、バックグラウンドスレッドに「通常の」オブジェクト(色/セマンティクスの範囲のリストなど)しか作成しないようにしてからUIスレッドで処理し、実際のSyntaxを作成する必要があります必要に応じてタイプを指定します。

関連する問題