C#复制文件,我不用线程复制多文件的时候程序会假死,但是我用单线程之后复制时间是原来的两倍,怎么优化
发布网友
发布时间:2022-05-27 11:59
我来回答
共3个回答
热心网友
时间:2023-10-20 11:54
虽然你使用了BackgroundWorker,这只能说明你用了一个后台线程,但是貌似你复制文件的过程依然是在一个线程里进行的,没看出来多线程体现在哪儿,如果我说的对的话,那么你这跟不用BackgroundWorker除了不会让ui线程卡死之外并不会对复制文件的操作有任何性能提升
如果你使用了多个BackgroundWorker并启用个复制操作就涉及一个很严重的问题就是如何“分流”,也就是把复制很多文件的操作分配到不同的线程中,这一点是提升性能至关重要的,如果你用不同的线程复制同一批文件自然会因为多个线程操作同一文件而遭遇io锁的问题
推荐做法:不管使用BackgroundWorker还是Thread,先用一个线程维护要复制文件的列表,也就是用一个线程查找要复制的文件,然后构建一个分配逻辑,新的线程启动时索取要复制的文件路径,复制时在列表中标记“正在复制。。。”,完成后标记“完成”,这样每次启动新线程来复制时自动到文件列表中查找未复制的文件然后进行操作。这样从总体看来就是一个个线程有序逐个复制文件。使用线程池能简化代码,但前面所说的“分流”(分流这个词是我为了方便理解在此杜撰的,不用去搜,正式的说法应该叫任务分配)的逻辑得你自己写,这是多线程的核心,如果你完全掌握了,那么多线程操作就掌握一半了
参考资料:http://msdn.microsoft.com/zh-cn/library/ms173178.aspx
热心网友
时间:2023-10-20 11:55
不是,要用多线程,参考System.Threading这个命名空间
你可以多开一个线程在里面复制文件。因为文件复制是个连续过程,然后WINDOWS又有个消息循环。一个函数就可以把它卡在那里了。
热心网友
时间:2023-10-20 11:55
单单利用现成不不能解决问题的,应该再加上委托,异步执行才能解决你的问题,还有COPY的速度基本不会有太大变动,因为无论你怎么写都是在调用系统的API所以速度基本都差不多了。