2009-04-09 4 views
1

저는 잠시 동안 켜고 끄는 작은 프로젝트를 진행해 왔으며 가까이에 있다고 생각하지만 문제가 있습니다. 아이디어는 파일을 제 3 자에게 FTP로 보내고 처리하고 5-10 분 후에 결과 세트를 생성합니다.이 결과 세트는 당사 측에서 다운로드하여 처리해야합니다..net 웹 페이지의 AsyncCallback이 실행되지 않습니다.

그래서 코드는, 현재 처리 된 파일의 목록을 기다리고 너무 자주 매를 확인, 파일을 밀어, 그것이 내가 함께

 
      if (!Page.IsPostBack) 
      { 
       string baseLocation = "C:\\temp\\"; 
       string fn = baseLocation + "fxxxupld.inc"; 

       ftp = new FtpClient(FTPServer, FTPUserName, FTPPassword); 
       ftp.Login(); 
       ftp.Upload(fn); 

       AsyncCallback callback = new AsyncCallback(CloseConnection); 

       ftp.ChangeDir("results"); 
       string[] Files = ftp.GetBloombergUploadList(); 
       int CHigh = Files.GetUpperBound(0); 
       String LatestFile = CheckForNewFile(CHigh, ftp); 
       ftp.BeginDownload(LatestFile, "c:\\temp\\Results.txt", callback); 
      } 

     private static string CheckForNewFile(int CHigh,FtpClient ftp) 
     { 
      int NHigh = 0; 
      string LatestFile = ""; 
      while (CHigh >= NHigh) 
      { 
       string[] Files = ftp.GetBloombergUploadList(); 
       NHigh = Files.GetUpperBound(0); 
       LatestFile = Files[NHigh-1].ToString(); 
       Thread.Sleep(3000); 
      } 
      return LatestFile; 
     } 

     private void CloseConnection(IAsyncResult result) 
     { 
      Debug.WriteLine("File downloaded: " + result.IsCompleted.ToString()); 
      if (ftp != null) ftp.Close(); 
      ftp = null; 
     } 

매우 간단 자갈길 단지 뭔가 조금 간단 수 있으며 새 파일이 나타나면 다운로드하십시오.

AsyncCallback을 추가하기 전에 페이지가 반환 될 때까지 사용자가 아무 것도 할 수 없다는 것을 제외하고는 프로세스가 정상적으로 작동했으며 AsyncCallback에 갑자기 추가 한 후 UPLOAD 부분은 원격 측에 스팸을 보내고 나는 (또는 적어도 특정 연결을) 충돌시킬 수있었습니다.

아무리 생각해도 ... 말할 필요도없이 일자리를 얻을 수 없을 때 우리 상인들이 조금 화가 나고 Bloomberg가 조금 화가 나면 일을 제대로 처리해야 할 필요가 있습니다. 그것을 :(해결하기 위해 노력하고 3+ 시간을 보낼

감사합니다!

답변

1

나는 당신의 상위 코드의 덩어리 Page_Load 핸들러에? 그리고 라인

ftp.Upload(fn); 

이 문제의 원인을 guesing거야? 그렇다면 사용자가 다시로드하고 있다고 말하고 싶습니다. e 페이지가 있으므로 이전보다 훨씬 자주 호출됩니다.

비동기 패턴을 보려는 올바른 위치에 있지만 사람들이 페이지를 너무 많이 새로 고치는 경우를 대비해야합니다.

+0

지금 빈 페이지에서 테스트하고 있습니다. Page_Load 핸들러를 사용하여 킥오프 할뿐입니다. 새로 고칠 내용이 없습니다. 어쩌면 나는 그것을 꺼내 다른 곳에서 쫓아 낼 것이다. 단지 그것을 배제하는 것이다. 감사. –

+0

정말 간단한 예제로 문제를 재현 할 수 있다면 코드 샘플을 편집 할 가치가 있습니다. –

관련 문제