C#实现多线程写入同一个文件的方法

本文实例讲述了C#实现多线程写入同一个文件的方法。分享给大家供大家参考。具体实现方法如下:

namespace WfpApp
{
 public partial class Form2 : Form
 {
  object obj = new object();
  public Form2()
  {
   InitializeComponent();
   System.Threading.Thread thread;
   string[] users = new string[] { "zkk", "admin", "administrator", "soft", "iany", "nec", "necsl" };
   for (int i = 0; i < users.Length; i++)
   {
    thread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(WriteLock));
    thread.Start(users[i]);
   }
  }
  public void WriteThread(object user)
  {
   string path = System.Windows.Forms.Application.StartupPath + "\\app\\";
   if (!System.IO.Directory.Exists(path))
    System.IO.Directory.CreateDirectory(path);
   path = path + "\\" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
   StringBuilder sb = new StringBuilder();
   sb.AppendLine("----------------------------" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "--------------------------");
   sb.AppendLine(user.ToString());
   sb.AppendLine("---------------------------------------------------------------------------------");
   sb.AppendLine();
   //if (!System.IO.File.Exists(path))
   // System.IO.File.Create(path).Close();
   System.IO.FileStream fileStream = new System.IO.FileStream(path, System.IO.FileMode.Append, System.IO.FileAccess.Write, System.IO.FileShare.ReadWrite);
   System.IO.StreamWriter sw = new System.IO.StreamWriter(fileStream, Encoding.Default);
   sw.Write(sb.ToString());
   sw.Close();
   sw.Dispose();
   fileStream.Close();
   fileStream.Dispose();
  }
  public void WriteLock(object user)
  {
   lock (obj)
   {
    string path = System.Windows.Forms.Application.StartupPath + "\\app\\";
    if (!System.IO.Directory.Exists(path))
     System.IO.Directory.CreateDirectory(path);
    path = path + "\\" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
    StringBuilder sb = new StringBuilder();
    sb.AppendLine("----------------------------" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "--------------------------");
    sb.AppendLine(user.ToString());
    sb.AppendLine("---------------------------------------------------------------------------------");
    sb.AppendLine();
    if (!System.IO.File.Exists(path))
     System.IO.File.Create(path).Close();
    System.IO.FileStream fileStream = new System.IO.FileStream(path, System.IO.FileMode.Append, System.IO.FileAccess.Write);
    System.IO.StreamWriter sw = new System.IO.StreamWriter(fileStream, Encoding.Default);
    sw.Write(sb.ToString());
    sw.Close();
    sw.Dispose();
    fileStream.Close();
    fileStream.Dispose();
   }
  }
 }
}

希望本文所述对大家的C#程序设计有所帮助。

(0)

相关推荐

  • c#多线程编程基础

    无论您是为具有单个处理器的计算机还是为具有多个处理器的计算机进行开发,您都希望应用程序为用户提供最好的响应性能,即使应用程序当前正在完成其他工作.要使应用程序能够快速响应用户操作,同时在用户事件之间或者甚至在用户事件期间利用处理器,最强大的方式之一是使用多线程技术. 多线程:线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程.如果某个线程进行一次长延迟操作, 处理器就切换到另一个线程执行.这样,多个线程的并行(并发)执行隐藏了长延迟,提高了处理器资源利用率

  • c#.net多线程编程教学——线程同步

    随着对多线程学习的深入,你可能觉得需要了解一些有关线程共享资源的问题. .NET framework提供了很多的类和数据类型来控制对共享资源的访问. 考虑一种我们经常遇到的情况:有一些全局变量和共享的类变量,我们需要从不同的线程来更新它们,可以通过使用System.Threading.Interlocked类完成这样的任务,它提供了原子的,非模块化的整数更新操作. 还有你可以使用System.Threading.Monitor类锁定对象的方法的一段代码,使其暂时不能被别的线程访问. System

  • c#多线程中Lock()关键字的用法小结

    本文介绍C# lock关键字,C#提供了一个关键字lock,它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待. 每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数.这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生. 其中,lock是一种比较好用的简单的线程同步方式,它是通过为给定对象获取互斥锁来实现同步的.它可以保证当一个线程在关键

  • 浅解关于C#多线程的介绍

    多线程的相关概念--------------------------------------------------------------------------------1.进程:是操作系统结构的基础:是一个正在执行的程序:计算机中正在运行的程序实例:可以分配给处理器并由处理器执行的一个实体:由单一顺序的执行显示,一个当前状态和一组相关的系统资源所描述的活动单元.2.线程:线程是程序中一个单一的顺序控制流程.是程序执行流的最小单元.另外,线程是进程中的一个实体,是被系统独立调度和分派的基本

  • c# 多线程编程 入门篇

    开始本应该是一篇洋洋洒洒的文字, 不过我还是提倡先做起来, 在尝试中去理解. 先试试这个: procedure TForm1.Button1Click(Sender: TObject);var i: Integer;begin for i := 0 to 500000 do begin Canvas.TextOut(10, 10, IntToStr(i)); end;end; 上面程序运行时, 我们的窗体基本是 "死" 的, 可以在你在程序运行期间拖动窗体试试... Delphi 为我

  • C#多线程ThreadPool线程池详解

    简单说明一下: 线程池可以看做容纳线程的容器:一个应用程序最多只能有一个线程池:ThreadPool静态类通过QueueUserWorkItem()方法将工作函数排入线程池: 每排入一个工作函数,就相当于请求创建一个线程: 线程池的作用: 1.线程池是为突然大量爆发的线程设计的,通过有限的几个固定线程为大量的操作服务,减少了创建和销毁线程所需的时间,从而提高效率. 2.如果一个线程的时间非常长,就没必要用线程池了(不是不能作长时间操作,而是不宜.),况且我们还不能控制线程池中线程的开始.挂起.和

  • c#多线程的应用全面解析

    1.使用多线程的几种方式 (1)不需要传递参数,也不需要返回参数 ThreadStart是一个委托,这个委托的定义为void ThreadStart(),没有参数与返回值. 复制代码 代码如下: class Program { static void Main(string[] args) { for (int i = 0; i < 30; i++) { ThreadStart threadStart = new ThreadStart(Calculate); Thread thread = n

  • c#中多线程访问winform控件的若干问题小结

    我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来解决这个问题,下面我将详细的介绍. 首先来看传统方法: 复制代码 代码如下: public partial class Form1 : Form     {        public Form1()        {            InitializeComponent();        } private void Form1_Load(object sender,

  • c# winform多线程的小例子

    在文本框中输入一个数字,点击开始累加按钮,程序计算从1开始累计到该数字的结果.因为该累加过程比较耗时,如果直接在UI线程中进行,那么当前窗口将出现假死.为了有更好的用户体验,程序启动一个新的线程来单独执行该计算,然后每隔200毫秒读取一次累加结果,并把结果显示到文本框下方的label控件中.同时,程序支持取消操作,点击取消累计按钮,程序将取消累加操作,并把当前累加值显示到label中.为了方便后面的描述,我把UI线程称作主线程,把执行累加计算的线程称作工作者线程.该过程有两个关键点: 1:如何在

  • c#使用多线程的几种方式示例详解

    (1)不需要传递参数,也不需要返回参数 ThreadStart是一个委托,这个委托的定义为void ThreadStart(),没有参数与返回值. 复制代码 代码如下: class Program { static void Main(string[] args) { for (int i = 0; i < 30; i++) { ThreadStart threadStart = new ThreadStart(Calculate); Thread thread = new Thread(thr

随机推荐