手头有个文件格式转换的 DLL ,正常一个文件格式转换需要 0.4s
首先做了一个小程序,读取了目录下的 100 个需要转换的文件的路径信息,然后 100 个依次进行转换,耗时 0.4* 100 = 40s
然后我把这个小程序复制了一个,成了小程序 2.
小程序和小程序 2 可以同时双开,进行文件转换。速度也加快了。
但是当我尝试在一个程序里面使用 task 或者多线程调用 DLL 里面的文件转换函数的时候,就报错了。DLL 内置了加密狗权限查阅功能,此时就异常了。但是很奇怪的是,小程序 1 和小程序 2 可以同时运行,没有出现机密狗权限的问题。
困扰我好久的问题,有大佬可以解答疑惑吗?
1
xiangyuecn 2023-12-23 18:06:43 +08:00
进程 线程 傻傻分不清
|
2
justdoitzZ OP @xiangyuecn 。。。。刚学 C# 没多久,就会 Debug.WriteLine
|
3
xiangyuecn 2023-12-23 19:06:39 +08:00
直接用 Process 新开两个子进程进行处理完事
|
4
opengps 2023-12-23 19:45:28 +08:00
应该是一楼说的问题,反射加载本质类似于拷贝一份到内存里用,所以你多个进程可以并行,但多线程显然程序的内部运行有冲突
|
5
opengps 2023-12-23 19:50:27 +08:00
换句话说,如果你非要一个程序处理,那么可以先拷贝多份,然后各个线程调用各自的副本文件
|
6
devliu1 2023-12-23 19:58:35 +08:00 via Android
盲猜 dll 里没有处理好多线程
|
7
justdoitzZ OP @devliu1 这个垃圾 DLL 是个黑箱。感觉按照楼上说的处理
|
8
justdoitzZ OP 按照兄弟们提供的思路,chatgpt 提供了如下代码,我再调试一下,我感觉可行了
using System.Diagnostics; // ... private void button2_Click(object sender, EventArgs e) { string path = @"c:\Work\temp\123\"; string[] suffixes = { ".avl", ".sum", ".nsm" }; FileProcessor fileProcessor = new FileProcessor(); fileProcessor.ListFilesRecursively(path, suffixes); // 获取原始结果 List<FileInfo> sourceFileInfos = fileProcessor.FileInfos; // 创建新的目标文件信息 List<FileInfo> targetFileInfos = fileProcessor.CreateTargetFileInfos(sourceFileInfos, ".txt"); int processesCount = 10; for (int i = 0; i < processesCount; i++) { int startIdx = i * targetFileInfos.Count / processesCount; int endIdx = (i == processesCount - 1) ? targetFileInfos.Count : (i + 1) * targetFileInfos.Count / processesCount; var processFiles = targetFileInfos.GetRange(startIdx, endIdx - startIdx); ProcessStartInfo startInfo = new ProcessStartInfo { FileName = "YourExecutable.exe", // 替换为实际的可执行文件名 Arguments = $"{string.Join(" ", processFiles.Select(f => $"\"{f.FilePath}\""))}", // 传递文件路径作为参数 WorkingDirectory = Path.GetDirectoryName(Application.ExecutablePath), // 设置工作目录 UseShellExecute = false, CreateNoWindow = true, }; Process process = new Process { StartInfo = startInfo }; process.Start(); } } |