using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Windows.Threading; namespace Multi_Thread { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { private bool _readStop = false; private bool _writeStop = false; private double _lineHaveRead = 0; private DispatcherTimer _readerTimer; private DispatcherTimer _writeTimer; private object _readObj = new object(); private object _writeObj= new object(); private Thread _readThread; private Thread _writeThread; public MainWindow() { InitializeComponent(); } #region Implement Methods private void WriteFile(object state) { using ( var fsFileStream = new FileStream(@"E:\C#\WPF\Multi-Thread\Multi-Thread\test.log", FileMode.Append, FileAccess.Write, FileShare.ReadWrite)) { StreamWriter sw = null; try { sw = new StreamWriter(fsFileStream); sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); // await Task.Run(()=>sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"))); } finally { if (sw != null) { sw.Flush(); sw.Close(); } } } // Thread.Sleep(200); //await Task.Delay(200); } private delegate void UpdateUI(string line); private bool reading = false; private void ReadFile(object status) { lock (_readObj) { UpdateUI uu = new UpdateUI(UpdateList); int linecount = 0; reading = true; using ( var fsFileStream = new FileStream(@"E:\C#\WPF\Multi-Thread\Multi-Thread\test.log", FileMode.OpenOrCreate, FileAccess.Read, FileShare.ReadWrite)) { StreamReader sr = null; try { sr = new StreamReader(fsFileStream); string line; while ((line = sr.ReadLine()) != null) { linecount++; if (linecount > _lineHaveRead) { this.Dispatcher.BeginInvoke(DispatcherPriority.Background,uu, line); // Dispatcher.BeginInvokeShutdown(DispatcherPriority.Background); } } _lineHaveRead = linecount; } finally { if (sr != null) { // sw.Flush(); sr.Close(); } // _readThread.Abort(); reading = false; } } } } private void UpdateList(string line) { this.TextBlockMessage.Text = line; this.ListBoxShow.Items.Add(line); // ListBoxShow.SelectedItem = ListBoxShow.Items[ListBoxShow.Items.Count - 1]; //ListBoxShow.ScrollIntoView(ListBoxShow.SelectedItem); this.TextBlockListBoxCount.Text = ListBoxShow.Items.Count.ToString(); ListBoxShow.ScrollIntoView(ListBoxShow.Items[ListBoxShow.Items.Count - 1]); } private void ReadTick_Event(object sender, EventArgs e) { ReadFile(this); //lock (_readObj) //{ //if(_readThread.ThreadState!=ThreadState.Running) //_readThread.Start(); // ThreadPool.QueueUserWorkItem(ReadFile); // } //if (reading == false) //{ // _readThread = new Thread(ReadFile); // _readThread.Start(); //} //ThreadPool.QueueUserWorkItem(ReadFile); //ReadFile(1); } private void WriteTick_Event(object sender, EventArgs e) { //lock (_writeObj) //{ ThreadPool.QueueUserWorkItem(WriteFile); //} //ThreadPool.QueueUserWorkItem(ReadFile); //ReadFile(1); } #endregion #region Button Event private void BtnWrite_OnClick(object sender, RoutedEventArgs e) { //_writeStop = false; //ThreadPool.QueueUserWorkItem(WriteFile); //WriteFile(); _writeTimer.Interval = new TimeSpan(0, 0, 0, 0, 10); _writeTimer.Tick += new EventHandler(WriteTick_Event); _writeTimer.Start(); //while (true) //{ // WriteFile(this); // Thread.Sleep(100); //} } private void BtnRead_OnClick(object sender, RoutedEventArgs e) { _readerTimer.Interval = new TimeSpan(0, 0, 0, 0, 100); _readerTimer.Tick += new EventHandler(ReadTick_Event); _readerTimer.Start(); } private void BtnStopWrite_OnClick(object sender, RoutedEventArgs e) { if (_writeTimer != null) { _writeTimer.Stop(); } } private void BtnStopRead_OnClick(object sender, RoutedEventArgs e) { if (_readerTimer != null) { _readerTimer.Stop(); } } private void BtnClear_OnClick(object sender, RoutedEventArgs e) { ListBoxShow.Items.Clear(); } #endregion private void MainWindow_OnLoaded(object sender, RoutedEventArgs e) { _readThread = new Thread(ReadFile); _writeThread = new Thread(WriteFile); _readerTimer = new DispatcherTimer(); _writeTimer = new DispatcherTimer(); } } }
<Window x:Class="Multi_Thread.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525" Loaded="MainWindow_OnLoaded"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="30"/> <RowDefinition Height="30"/> <RowDefinition Height="30"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="100"/> <ColumnDefinition Width="100"/> <ColumnDefinition Width="100"/> <ColumnDefinition Width="100"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <Button Name="BtnWrite" Grid.Row="0" Grid.Column="0" Content="WriteFile" Click="BtnWrite_OnClick"/> <Button Name="BtnRead" Grid.Row="0" Grid.Column="1" Content="ReadFile" Click="BtnRead_OnClick"/> <Button Name="BtnStopWrite" Grid.Row="0" Grid.Column="2" Content="StopWrite" Click="BtnStopWrite_OnClick"/> <Button Name="BtnStopRead" Grid.Row="0" Grid.Column="3" Content="StopRead" Click="BtnStopRead_OnClick"/> <Button Name="BtnClear" Grid.Row="0" Grid.Column="4" Content="Clear" Click="BtnClear_OnClick"/> <TextBlock Name="TextBlockMessage" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="4" VerticalAlignment="Center" TextWrapping="WrapWithOverflow">Messages Show Here</TextBlock> <TextBlock Name="TextBlockListBoxCount" Grid.Row="1" Grid.Column="4" VerticalAlignment="Center"></TextBlock> <ProgressBar Name="ProgressBarRead" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="5" IsIndeterminate="True"></ProgressBar> <ListBox Name="ListBoxShow" Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="3"></ListBox> <ListBox Name="ListBoxStatus" Grid.Column="3" Grid.Row="3" Grid.ColumnSpan="2"></ListBox> </Grid> </Window>
原文:http://www.cnblogs.com/leakeyash/p/5090482.html