【问题标题】:Task.Factory.StartNew not executing the method in .net [closed]Task.Factory.StartNew 不执行 .net 中的方法 [关闭]
【发布时间】:2016-11-22 22:20:01
【问题描述】:

我有大约 5000 个文件位于 FTP 中,所以我使用 FTP 下载这些文件,然后解压缩文件,最后处理并推送到 oracle 数据库。除了处理和推送到数据库一切正常,我不知道为什么处理没有发生。我可以看到调试器命中了该方法,但它没有进入内部方法。如何解决这个问题?

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() 方法根本没有执行

编辑 filepath 有错字导致问题,谢谢,但我的问题是是否有任何同步问题,因为首先解压缩文件并同时处理文件不可用的文件,它会在处理前等待解压缩 -

添加支票while(!File.Exists("")) { Thread.Sleep(1000); 这有什么问题吗??

【问题讨论】:

  • 你怎么知道ProcessFile 没有被执行?您是否尝试在该行设置断点?
  • 我把断点放在那里,可以看到它打到那里但没有进去,没有数据被推入数据库。文件下载和提取成功
  • @peter 可能你正在主线程的堆栈跟踪中调试。
  • 为什么foreach后面有2个大括号?
  • @CodingYoshi 我错了,但这有什么问题吗??

标签: c# .net multithreading ftp task-parallel-library


【解决方案1】:

如果您在此处尝试此代码,您会发现它有效。它与您的代码非常相似。由于这可行,因此您的问题在其他地方,与任务无关。

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..." );
  }
}

【讨论】:

  • 是的,你是对的,文件路径中有错字导致问题,谢谢,但我的问题是是否有任何同步问题,因为首先解压缩文件并同时处理文件不可用的文件,将它在处理之前等待解压缩。因为现在我得到的文件无法像
  • 我添加了这个检查 while(!File.Exists("")) { Thread.Sleep(1000); } 这会造成任何问题
  • 您能否编辑问题,因为很多人投票要求您这样做。然后我可以帮你。
  • @peter 还请在您编辑的问题中包含 Process 方法的管道,以便我可以查看您是否在那里使用任务。
猜你喜欢
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-29
  • 1970-01-01
相关资源
最近更新 更多