私はタスクを初めて経験しています。本当に使い方が分かりません。別のスレッドからオブジェクトにアクセスする - タスク
私は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がフリーズしていない間に複数の異なるスレッドでこれを行う方法はありますか?
あなたはこのエラーに似ている可能性があります:http://stackoverflow.com/questions/9732709/the-calling-thread-cannot-access-this-object-because-a-different-thread-owns-it –
可能性のある[.NETの異なるスレッド間で共有されているリスト]の重複の可能性があります。ご覧のとおり、私は既に実装しています(http://stackoverflow.com/questions/4011031/list-shared-different-threads-in-net) –
Dispatcher.Invoke call –