2014-09-24 3 views
3

У меня есть программа на C#, которая запрашивает базу данных (server3) для определения файлов, которые пользователь выполняет, а затем копирует эти файлы с (server1) на (server2).Замедление сервера при копировании файлов

Для упрощения, что дальнейшее применение

  • C# выполняется на настольном компьютере
  • Оригинальные файлы находятся на server1
  • Файлы должны быть скопированы в server2
  • Server3 содержит базу данных

Когда я запускаю эту программу на своем рабочем столе, все работает отлично, кроме server1, что, кажется, almos t шлифовать до холата примерно через 5 минут, даже несмотря на то, что процесс копирования продолжает работать нормально даже через 5 минут. Любое другое приложение/пользователь, пытающийся подключиться к этому серверу, не может.

Они просто получают вращающийся курсор, который останавливается только в том случае, если я перестаю запускать программу на своем рабочем столе. Первые 5 минут в процессе копирования все хорошо для всех. При выходе за пределы 5 минут файлы продолжают копироваться, но при этом другие начинают испытывать проблемы с подключением к серверу1.

Я даже пробовал использовать sleep, поскольку я предполагал, что замедление произошло из-за слишком большой активности сети и/или слишком большой активности ввода-вывода на сервере1. sleep ничего не помогло, та же проблема продолжается. Поэтому я предполагаю, что проблема происходит по другой причине.

Я использую код, подобный этому, чтобы скопировать файлы

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

Почему это происходит?

+0

Как вы копируете файлы? Если вы просто делаете кучу последовательных копий файлов, это звучит так, как будто ваш сервер просто недостаточно. Если вы пытаетесь запустить много копий параллельно, вы, возможно, должны структурировать свой код, чтобы быть менее агрессивным. –

+0

Я копирую определенные файлы на основе запроса к базе данных. Не параллельное копирование, оно копирует 1 файл за раз. – oshirowanen

+0

Это не отвечает на мой вопрос. Можете ли вы показать код? –

ответ

2

Согласно this article, основной причиной замедления является использование буферизации копией файла.

В Windows Vista или более поздней версии можно избежать использования буферизации, указав COPY_FILE_NO_BUFFERING на номер CopyFileEx() Windows API function.

Вы можете указать 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); 

Возможно, стоит попробовать это и посмотреть, если это поможет.

+0

@oshirowanen просто хочет, чтобы 'int cancel = 0;' определялся в предыдущей строке.(Я обновляю образец) –

+0

Код работает, но он по-прежнему вызывает первоначальную проблему, т. Е. Примерно через 5 минут все приложения/пользователи, которым требуется server1, начинают замедляться, пока я не остановлю приложение копирования с рабочего стола. – oshirowanen

+0

@oshirowanen А хорошо, стоило попробовать. Вы прочитали статью, которую я цитировал в начале моего ответа, - она ​​предлагает некоторые другие вещи. –

Смежные вопросы