代码之家  ›  专栏  ›  技术社区  ›  TK.

用于文件操作的C#线程

  •  3
  • TK.  · 技术社区  · 17 年前

    有没有一个好的(简单的)方法来产生一个新线程,保存文件,并销毁线程而不产生任何讨厌的副作用?!

    必须说,我以前从未使用过线程,所以我是一个完全的新手!任何和所有的帮助将不胜感激!

    5 回复  |  直到 17 年前
        1
  •  5
  •   Frederik Gheysels    17 年前

    您可以使用BackGroundWorker组件,因为它将为您抽象一些线程部分。

        2
  •  5
  •   Jon Skeet    17 年前

    BackgroundWorker (正如Frederik所建议的那样)是一个很好的选择,特别是如果您想在保存时向UI报告进度。A. search for BackgroundWorker tutorial 获得很多点击率,所以你应该能够跟随其中一个来开始。

    需要注意的一件事是:是否有任何方法可以更改您试图从UI线程保存的数据结构?如果是这样的话,您应该在保存时禁用UI的这些方面——保存数据到一半(可能!)会很糟糕,然后允许用户更改其中的一些内容。如果您可以有效地将数据传递到后台线程,然后不从UI线程接触数据,那么您的生活就会轻松得多。

        3
  •  3
  •   amaca    17 年前

    你的问题可能是有几种简单易行的方法。如果您只想设置文件保存,而不想知道文件保存何时完成,那么就有一个方法

    void SaveMyFile(object state)
    {
        // SaveTheFile
    }
    

    ThreadPool.QueueUserWorkItem( SaveMyFile );
    

    我会做你想做的。

        4
  •  3
  •   Mats Fredriksson    17 年前

    我建议您使用异步I/O。它的设置稍微容易一些,并且不需要您自己创建新线程。

    例如,异步编程是指您有一个文件流要写入,但不想等待它完成。您可能希望在完成时收到通知,但不想等待。

    你要做的是使用 BeginWrite / BeginRead EndWrite / EndRead 流类上可用的函数。

    在方法中,首先调用BeginWrite,其中包含所有要写入的数据,并传入回调函数。当BeginWrite完成时,将调用此函数。

    在回调函数中,调用EndWrite并清理流并检查错误。

    BeginWrite不会阻塞,这意味着如果从事件处理程序中调用它,线程可以完成该处理程序并继续处理更多事件(如其他GUI事件)。

    using System;
    using System.IO;
    using System.Text;
    
    class Program
        {
            private static FileStream stream;
            static void Main(string[] args)
            {
                stream = new FileStream("foo.txt", 
                                        FileMode.Create, 
                                        FileAccess.Write);
    
                const string mystring = "Foobarlalala";
                ASCIIEncoding encoding = new ASCIIEncoding();
                byte[] data = encoding.GetBytes(mystring);
                Console.WriteLine("Started writing");
                stream.BeginWrite(data, 0, data.Length, callback, null);
                Console.WriteLine("Writing dispatched, sleeping 5 secs");
                System.Threading.Thread.Sleep(5000);
            }
    
            public static void callback(IAsyncResult ia)
            {
                stream.EndWrite(ia);
                Console.WriteLine("Finished writing");
            }
        }
    }
    

    睡眠是非常重要的,因为如果主线程被终止,那么写东西的线程将被终止。这不是GUI应用程序中的问题,只是在这个小示例中。

    MSDN有一个 pretty good overview 关于如何写这些东西,还有一些 good articles 在异步编程的一般情况下,如果你去 backgroundworker ThreadPool .

        5
  •  0
  •       17 年前

    或者你可以用老朋友。