我建议使用异步 I/O。设置起来稍微容易一些,并且不需要您自己创建新线程。
例如,异步编程是您想要写入但不想等待它完成的文件流。您可能希望在完成时收到通知,但您不想等待。
您所做的是使用 Stream 类中可用的 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。