Попробуйте что-то вроде этого
public void DoSomething()
{
Task.Run(() =>
{
BackgroundProcess();
});
}
private void BackgroundProcess()
{
string ControlValue;
Application.Current.Dispatcher.Invoke(() =>
{
ControlValue = textBox.Text;
});
ControlValue += ControlValue;
Application.Current.Dispatcher.Invoke(() =>
{
textBox.Text = ControlValue;
});
}
То, что я делаю, - это доступ к элементу управления только тогда, когда это абсолютно необходимо, и выполнение этого в диспетчере. Все остальное делается в фоновом потоке. Пока вы делаете только несколько записей для этого, это не должно засорять диспетчер. TextBox.AppendText и TextBox.ScrollToEnd, и это, кажется, не влияет на пользовательский интерфейс. Таким образом, ключ заключается в том, чтобы выполнять минимальный объем работы, необходимый с помощью элементов управления. Если вы ожидаете ввода, то вам следует использовать MVVM и DataBinding, чтобы вы ударили по соответствующим частям процесса при изменении значений.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security;
using System.Text;
using System.Threading.Tasks;
using Microsoft.VisualBasic;
public class MVVMExampleViewModel : System.ComponentModel.INotifyPropertyChanged
{
private string _MajorChange;
public string MajorChange
{
get
{
return _MajorChange;
}
set
{
_MajorChange = value;
DoPropertyChanged("MajorChange");
-- Start process using value here
}
}
private void DoPropertyChanged(string propertyname)
{
PropertyChanged(me, New PropertyChangedEventArgs(propertyname));
}
public event PropertyChangedEventHandler PropertyChanged;
}
Использование WPF
<Grid DataContext="{Binding CurrentMVVMExample}"
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
</Grid.RowDefinitions>
<Label Content="{DynamicResource NewItemMessage}" Visibility="{Binding IsDetached, Converter={StaticResource BooleanToVisibilityConverter}, Mode=OneWay}" Foreground="#FFBD0000" RenderTransform="{DynamicResource NewItemMessageLocation}"/>
<Label Content="Status" Grid.Column="0" Grid.Row="1" />
<TextBox Text="{Binding MajorChange, Delay=500, UpdateSourceTrigger=PropertyChanged}"
Grid.Column="1" Grid.Row="1" Width="{DynamicResource SectionFieldWidth}" />
</Grid>