2016-11-22 4 views
0

У меня есть около 5000 файлов, расположенных по FTP, поэтому я загружаю их с помощью FTP, а затем распаковываю файлы, в конечном итоге обрабатывая и вставляя в базу данных oracle. Кроме обработки и вдаваясь в базу данных, все идет хорошо, я не знаю, почему обработка не происходит. Я вижу, как отладчик ударяет по этому методу, но не идет внутрь метода. Как решить эту проблему?Task.Factory.StartNew не выполняет метод в .net

var list = ftp.GetFileList(remotepath); 

//------------------- 
DateTime dt = DateTime.Now; 
string st = String.Format("{0:yyyyMMdd}", dt);//20161120 
Task[] myTasks = new Task[list.Count]; 
int i = 0; 
foreach (string item in list) 
{ 
    { 
    if (item.StartsWith("GExport_") && (!item.ToUpper().Contains("DUM")) && (item.Contains(st)) && (!item.ToUpper().Contains("BLK"))) 
    { 
     4gpath = item; 
     //Downloadfile() 
     ftp.Get(dtr["REMOTE_FILE_PATH"].ToString() + 4gpath , @localDestnDir + "\\" + dtr["SOURCE_PATH"].ToString()); 
     download_location_hw = dtr["LOCAL_FILE_PATH"].ToString(); 
     // Spin off a background task to process the file we just downloaded 
     myTasks[i++] = Task.Factory.StartNew(() => 
     { 
      //Extractfile()    
      ExtractZipfiles(download_location_hw + "//" + huwawei4gpath, dtr["REMOTE_FILE_PATH"].ToString(), 
       dtr["FTP_SERVER"].ToString(), dtr["FTP_USER_ID"].ToString(), 
       dtr["TECH_CODE"].ToString(), dtr["VENDOR_CODE"].ToString()); 
      //Extract the zip file referred to by download_location_hw 
      // Process the extracted zip file 
      ProcessFile() 
     }); 
     } 
    } 
    } 
    Task.WaitAll(myTasks); 

Здесь ProcessFile() метод не выполняется на всех

EDIT была опечатка в filepath вызывают вопрос, спасибо, но мой вопрос, есть ли проблема синхронизации, так как первый разархивировать файл и тот же когда файл не был доступен, будет ли он ждать распаковки перед обработкой -

добавлена ​​проверка while(!File.Exists("")) { Thread.Sleep(1000); это делает какие-либо выводы?

+0

Откуда вы знаете, что 'ProcessFile' не выполняется? Вы пытались поставить точку останова на этой линии? – wdosanjos

+0

Я поставил там точку останова и вижу, что он попадает туда, но не входит внутрь, и ни одна из данных не загружается в базу данных. Файлы загружены и извлечены успешно. – peter

+0

@peter, вероятно, вы отлаживаете трассировку стека основного нить. – mybirthname

ответ

1

Если вы попробуете этот код здесь, вы заметите, что он работает. Он очень похож на ваш код. Поскольку это работает, ваша проблема находится в другом месте и не связана с Task (s).

class Program { 
    static void Main(string[] args) { 
    var list = new List<string> { "1", "2" }; 
    Task[] myTasks = new Task[ list.Count ]; 
    int i = 0; 
    foreach(string item in list) { 

     // Spin off a background task to process the file we just downloaded 
     myTasks[ i++ ] = Task.Factory.StartNew(() => 
     { 

      //Extract the zip file referred to by download_location_hw 
      // Process the extracted zip file 
      ProcessFile(); 

      }); 
    } 



    Task.WaitAll(myTasks); 

    Console.WriteLine("in main after processing..."); 
    Console.Read(); 
    } 

    private static void ProcessFile() { 
    Console.Write("Processed..."); 
    } 
} 
+0

Да, вы правы, была проблема с печатью в filepath, спасибо, но мой вопрос в том, есть ли какая-либо проблема синхронизации, поскольку сначала распакуйте файл и файл процесса с тем же временем, где файл недоступен, будет ли он ждать разархивирования обрабатывать. Потому что теперь я получаю файл, который не может быть доступен, как – peter

+0

. Я добавил эту проверку, пока (! File.Exists ("")) { Thread.Sleep (1000); } делает ли это какие-либо проблемы? – peter

+0

Не могли бы вы отредактировать вопрос, поскольку многие люди проголосовали за вас, прося вас сделать это. Я могу помочь вам. – CodingYoshi