如何在C#中等待线程完成?

时间:2016-07-01 07:28:40

标签: c# excel multithreading

我创建了两个线程来获取一个表和一个函数ExcelSave(DataTable, nameofSheetinExcel),以基于Thread的名称将所有DataTable保存到Excel。

我想等待第一个线程保存完成并转到第二个线程进行保存。

我创建了两个帖子:

var t1 = new Thread(new ThreadStart(RegisterInfo))
{
    Name = "Thread1"
};
t1.Start();

var t2 = new Thread(new ThreadStart(RegisterInfo))
{
    Name = "Thread2"
};
t2.Start();
t1.Join();
t2.Join();

我的代码保存文件excel如下:

if (Thread.CurrentThread.Name == "Thread1")
        ExcelSave(dt, "Thread 1");
else
        ExcelSave(dt, "Thread 2");

因为我有例外:

  

保存文件时出错,因为进程无法访问文件' D:\ lapproject \ bin \ Debug \ data.xlsx'因为另一个进程正在使用它。 System.Exception {System.IO.IOException}`

有什么方法可以避免这种情况吗?感谢所有人。

1 个答案:

答案 0 :(得分:1)

您可以使用以下方法阻止多个线程同时访问共享资源,它将管理您的错误。

  1. 使用mutex类来处理代码:

    private readonly Mutex m = new Mutex();
    public void ThreadSafeMethod() {
        m.WaitOne();
        try {
            /*excel related critical code */
        } finally {
            m.ReleaseMutex();
        }
    }
    
    1. 使用锁定方法:

      private readonly object syncLock = new object();
      
      public void ThreadSafeMethod() {
          lock(syncLock) {
              /*excel related critical code */
          }
      }