如何在C#中等待线程完成?
我创build了两个线程来获取一个表和一个函数ExcelSave(DataTable, nameofSheetinExcel)
来保存所有的DataTable到基于Thread的名字的Excel。
我想等待第一个线程保存完成,并转到第二个线程保存。
我创build了两个线程:
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}`
有任何方法可以避免这种情况? 感谢所有人。
您可以使用以下方法来防止multithreading同时访问共享资源,并且会pipe理您的错误。
-
使用互斥类来处理代码:
private readonly Mutex m = new Mutex(); public void ThreadSafeMethod() { m.WaitOne(); try { /*excel related critical code */ } finally { m.ReleaseMutex(); } }
-
使用locking方法:
private readonly object syncLock = new object(); public void ThreadSafeMethod() { lock(syncLock) { /*excel related critical code */ } }