好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

.NET 4.5 异步IO

.NET 4.5 异步IO

.NET 4.5 异步IO

在C/S架构中,不管是传统的winform还是wpf都可能会遇到进行异步操作文件的时候。文件小还好说,直接写操作代码。

如果是大文件很多时候做成异步的操作。在界面上显示一个进度条什么的,后台使用一个backgroundworker来做。在这里告诉大家在.NET Framework4.5中支持异步IO的操作。大大简化之前些的异步方法代码。

使用backgroundworker代码

View Code

 private   void  Button_Click_3( object   sender, RoutedEventArgs e)
        {
            System.ComponentModel.BackgroundWorker bak  =  new   System.ComponentModel.BackgroundWorker();
            bak.DoWork  +=  bak_DoWork;
            bak.RunWorkerCompleted  +=  bak_RunWorkerCompleted;
            bak.RunWorkerAsync();          
        }

          void  bak_DoWork( object   sender, System.ComponentModel.DoWorkEventArgs e)
        {
              string  sourceDir =  @"  E:\  "  ;
              string  endDir =  @"  F:\  "  ;
              foreach  ( string  filename  in   Directory.EnumerateFiles(sourceDir))
            {
                  using  (FileStream SourceStream =  File.Open(filename, FileMode.Open))
                {
                      using  (FileStream DestinationStream = File.Create(endDir + filename.Substring(filename.LastIndexOf( '  \\  '  ))))
                    {
                        SourceStream.CopyTo(DestinationStream);
                    }
                }
            }
        }

          void  bak_RunWorkerCompleted( object   sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show(  "  ok  "  );
        } 

 private   void  Button_Click_3( object   sender, RoutedEventArgs e)
        {
            System.ComponentModel.BackgroundWorker bak  =  new   System.ComponentModel.BackgroundWorker();
            bak.DoWork  +=  bak_DoWork;
            bak.RunWorkerCompleted  +=  bak_RunWorkerCompleted;
            bak.RunWorkerAsync();          
        }

          void  bak_DoWork( object   sender, System.ComponentModel.DoWorkEventArgs e)
        {
              string  sourceDir =  @"  E:\  "  ;
              string  endDir =  @"  F:\  "  ;
              foreach  ( string  filename  in   Directory.EnumerateFiles(sourceDir))
            {
                  using  (FileStream SourceStream =  File.Open(filename, FileMode.Open))
                {
                      using  (FileStream DestinationStream = File.Create(endDir + filename.Substring(filename.LastIndexOf( '  \\  '  ))))
                    {
                        SourceStream.CopyTo(DestinationStream);
                    }
                }
            }
        }

          void  bak_RunWorkerCompleted( object   sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show(  "  ok  "  );
        } 

以上应该是最基本的操作了,代码是不是很多?看看.NET Framework 4.5的写法吧。

 private   async   void  Button_Click_2( object   sender, RoutedEventArgs e)
        {
              string  sourceDir =  @"  E:\  "  ;
              string  endDir =  @"  F:\  "  ;
              foreach  ( string  filename  in   Directory.EnumerateFiles(sourceDir))
            {
                  using  (FileStream SourceStream =  File.Open(filename, FileMode.Open))
                {
                      using  (FileStream DestinationStream = File.Create(endDir + filename.Substring(filename.LastIndexOf( '  \\  '  ))))
                    {
                          await   SourceStream.CopyToAsync(DestinationStream);
                    }
                }
            }
            MessageBox.Show(  "  ok  "  );
        } 

希望能帮助到一些人。

作者: risk
出处: http://www.cnblogs.com/risk
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

 

分类:  .NET

标签:  .NET 4.5 异步 IO

.NET程序默认启动线程数

 

问:一个.NET程序在运行时到底启动了多少个线程?

答:至少3个。

启动CLR并运行Main方法的主线程 调试器帮助线程 Finalizer线程

   class   Program
  {
      static   void  Main( string  [] args)
    {
      Console.WriteLine(  "  Main thread: {0}  "  ,
        Thread.CurrentThread.ManagedThreadId);
      Console.ReadKey();
    }
  } 

通常,CLR会根据情况启动更多的特殊线程。

Finalizer线程:该线程负责运行GC进行垃圾对象回收。 并发的GC线程:GC会根据情况启动更多的线程并发进行垃圾回收。 服务器GC线程:在服务器GC模式下,CLR可能会为多核机器的每个核创建GC托管堆和回收线程。 调试器帮助线程:该线程负责为类似WinDbg等调试器提供帮助。 AppDomain卸载线程:CLR可能会启动一个工作线程来卸载应用程序域。 ThreadPool线程:ThreadPool会根据情况创建线程。

 

 

 

标签:  .NET ,  Threading

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于.NET 4.5 异步IO的详细内容...

  阅读:42次