我正在尝试使用文本框来显示完成任务。基本上就像控制台应用程序将如何显示正在发生的事情。
然而,文本框中的文本仅在Window_Loaded_1完成后才更新,然后显示所有文本而不是实时显示。
xaml代码:
<Window x:Class="timelineTesting.Windows.CreateNewProject"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="CreateNewProject" Height="300" Width="579" Loaded="Window_Loaded_1">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBox Text="{Binding Path=LogData, UpdateSourceTrigger=PropertyChanged}" />
</Grid>
C#代码:
public partial class CreateNewProject : Window, INotifyPropertyChanged
{
private string _data;
public String LogData
{
get
{
return _data;
}
set
{
_data = value;
OnPropertyChanged("LogData");
}
}
public CreateNewProject()
{
InitializeComponent();
this.DataContext = this;
}
private void Window_Loaded_1(object sender, RoutedEventArgs e)
{
Task t = new Task(() => Directory.CreateDirectory(this.ProjectName));
LogData+="Starting new project creation...." + Environment.NewLine;
LogData += "Creating project directory '" + ProjectName + "'....";
try
{
t.Start();
t.Wait();
}
catch (Exception ex)
{
LogData += "Error:" + Environment.NewLine;
LogData += ex.InnerException.ToString();
}
LogData+= "Done!" + Environment.NewLine;
t = new Task(() => File.Copy(this.VideoFilePath, newVideoPath));
LogData+= "Copying video file to project directory....";
try
{
t.Start();
t.Wait();
}
catch (Exception ex)
{
LogData+= "Error:" + Environment.NewLine;
LogData+= ex.InnerException.ToString();
}
LogData+= "Done!" + Environment.NewLine;
// many more tasks
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
答案 0 :(得分:3)
t.Wait()
是一个阻止通话。这意味着你真的没有做多线程。您启动任务,然后等待它完成。你应该做的是await
来完成任务。
答案 1 :(得分:2)
使用Background Worker代替具有ProgressChanged事件的事件,该事件可以使用并发状态更新文本框。
请参阅文章:C# WPF: Threading, Control Updating, Status Bar and Cancel Operations Example All In One,其中提供了一个示例。
答案 2 :(得分:2)
使用await
:
private async void Window_Loaded_1(object sender, RoutedEventArgs e)
{
Task t = Task.Run(() => Directory.CreateDirectory(this.ProjectName));
LogData += "Starting new project creation...." + Environment.NewLine;
LogData += "Creating project directory '" + ProjectName + "'....";
try
{
await t;
}
catch (Exception ex)
{
LogData += "Error:" + Environment.NewLine;
LogData += ex.ToString();
}
LogData += "Done!" + Environment.NewLine;
t = Task.Run(() => File.Copy(this.VideoFilePath, newVideoPath));
LogData += "Copying video file to project directory....";
try
{
await t;
}
catch (Exception ex)
{
LogData += "Error:" + Environment.NewLine;
LogData += ex.ToString();
}
LogData += "Done!" + Environment.NewLine;
// many more tasks
}