有一个类FileHelper。有一个用户控件FileOperation:上边有两个按钮。开始、结束。有一个UI MainWindowUI上有个TabControl,TabControl上有多个TabItem都调用了FileOperation。
我想实现单击每个TabItem上FileOperation的按钮,都调用FileHelper去给Log文件写入数据。如何用多线程实现啊,主要是每个FileOperation怎么能互不影响。在FileHelper类实现多线程。

解决方案 »

  1.   

    在按钮的点击事件中使用线程去调用FileHelper中的方法就可以了。
    new Thread();
    ThreadPool.QueueUserWorkItem();
    MyDelegate.BeginInvoke();
    这个都可以达到开启线程的目的。多线程同时写入肯定会造成混乱,所以要么使用WaitHandle来同步,要么使用lock把写入代码lock主。
    同时知允许一个线程去写入,如LS所说这种情况下使用多线程并不能达到提高效率的目的。
    但是可以使主界面不至于卡主。
      

  2.   

    如果是4.0Framework,可以用来 ConcurrentQueue<T> 实现。在适合的时候(比如创建FileHelper实例时,能确定要读写的log文件后)打开一个新线程来读写log文件,这个线程循环检查FileHelper内部的 ConcurrentQueue 是否有内容,并使用 Dequeue() 方法 取出内容,写入文件。需要调用FileHelper写文件时,只需向队列中 Queue 要写入的内容即可。由于 ConcurrentQueue 自身是线程安全的,且在内容为空时 Dequeue 会阻塞,所以不需要使用同步对象。如果Framework版本低于4.0,可以使用 Queue<T> 加上一个同步对象如 ManualResetEvent 来管理队列内容。
      

  3.   

    现在有多少使用4.0或以上版本的呢,1.1没有泛型,2.0少了lamda,3.5打包体积超过200M,想用vs2012....可是,公司的电脑版本只到3.0....域管理不能擅自安装....烦死了要
      

  4.   


    用 client profile 打包不用200M。
      

  5.   


    我意思是向同一个Log写文件,每个控件都调用FileHelper,但是他们可以一起同时工作。
    在什么时候开启新线程呢。