gpt4 book ai didi

c# - 复制文件时服务器变慢

转载 作者:行者123 更新时间:2023-11-30 16:57:49 24 4
gpt4 key购买 nike

我有一个 C# 程序,它查询数据库 (server3) 以确定用户需要的文件,然后将这些文件从 (server1) 复制到 (server2)。

进一步简化

  • C# 应用程序在桌面计算机上执行
  • 原始文件在server1上
  • 文件将被复制到server2
  • Server3 包含数据库

当我在我的桌面上运行这个程序时,除了服务器 1 之外,一切正常,它似乎在大约 5 分钟后几乎停止运行,尽管复制过程在 5 分钟后继续正常工作。任何其他尝试连接到该服务器的应用程序/用户都无法连接。

他们只是得到一个旋转的光标,只有当我停止在我的桌面上运行该程序时它才会停止。在复制过程的前 5 分钟,每个人都很好。超过 5 分钟范围时,文件会继续复制,但此时其他人开始遇到与服务器 1 的连接问题。

我什至尝试过使用 sleep,因为我认为速度变慢是因为服务器 1 上的网络事件过多和/或磁盘 I/O 事件过多。 sleep 没有任何帮助,同样的问题仍然存在。所以我猜问题是由于其他原因而发生的。

我正在使用与此类似的代码来复制文件

while (reader1.read(){
// system.threading.thread.sleep(2000);
system.io.file.copy(source, destination);
}

为什么会这样?

最佳答案

根据 this article,速度变慢的主要原因是文件副本使用了缓冲。

在 Windows Vista 或更高版本上,可以通过为 CopyFileEx() Windows API function 指定 COPY_FILE_NO_BUFFERING 来避免使用缓冲.

您可以按如下方式指定 P/Invoke:

enum CopyProgressResult: uint
{
PROGRESS_CONTINUE = 0,
PROGRESS_CANCEL = 1,
PROGRESS_STOP = 2,
PROGRESS_QUIET = 3
}

enum CopyProgressCallbackReason: uint
{
CALLBACK_CHUNK_FINISHED = 0x00000000,
CALLBACK_STREAM_SWITCH = 0x00000001
}

delegate CopyProgressResult CopyProgressRoutine(
long TotalFileSize,
long TotalBytesTransferred,
long StreamSize,
long StreamBytesTransferred,
uint dwStreamNumber,
CopyProgressCallbackReason dwCallbackReason,
IntPtr hSourceFile,
IntPtr hDestinationFile,
IntPtr lpData);

[Flags]
enum CopyFileFlags: uint
{
COPY_FILE_FAIL_IF_EXISTS = 0x00000001,
COPY_FILE_RESTARTABLE = 0x00000002,
COPY_FILE_OPEN_SOURCE_FOR_WRITE = 0x00000004,
COPY_FILE_ALLOW_DECRYPTED_DESTINATION = 0x00000008,
COPY_FILE_COPY_SYMLINK = 0x00000800, //NT 6.0+
COPY_FILE_NO_BUFFERING = 0x00001000
}

[DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool CopyFileEx
(
string lpExistingFileName,
string lpNewFileName,
CopyProgressRoutine lpProgressRoutine,
IntPtr lpData,
ref Int32 pbCancel,
CopyFileFlags dwCopyFlags
);

然后这样调用(替换成你自己的文件名);

int cancel = 0;
CopyFileEx(@"C:\tmp\test.bin", @"F:\test.bin", null, IntPtr.Zero, ref cancel, CopyFileFlags.COPY_FILE_NO_BUFFERING);

可能值得尝试一下,看看是否有帮助。

关于c# - 复制文件时服务器变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26015807/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com