2014-01-13 3 views
0

을 통해 Amazon (S3)에 디렉토리를 업로드 할 수 없습니다. C# 및 스레딩에 초보자입니다. 문제가 해결되지 않아서 생각합니다. 내 문제에 대한 답변을 얻을 수있는 가장 좋은 장소입니다.C# 작업자 스레드

로컬 컴퓨터에서 Amazon S3 서비스로 폴더/폴더를 업로드하려고합니다 (폴더 크기는 최대 90MB까지 5MB입니다). 아마존 TransferUtility과 타이머가 경과 할 때 s3에 디렉토리/폴더를 업로드하는 타이머를 사용하고 있습니다.

두 가지 문제점이 있습니다. 일부 디렉토리를 업로드 한 후

1]

나는 예외를 얻을 스레드 내가 파일에 예외를 기록하려고 종료하고이

"

메시지가 말한다 -> 스레드가 중단되었습니다.

스택 트레이스 - Amazon.Runtime.AmazonWebServiceClient.InvokeConfigured에서 Amazon.Runtime.AmazonWebServiceClient.getRequestStreamCallback (IAsyncResult를 결과)에 >
요청 Amazon.Runtime.AmazonWebServiceClient.Invoke [T, R (R 요청 AsyncCallback에서 Amazon.Runtime.AmazonWebServiceClient.Invoke (AsyncResult asyncResult) 에서 Amazon.Runtime.AmazonWebServiceClient.InvokeHelper (AsyncResult asyncResult)에서 (AsyncResult asyncResult) (PutObjectRequest putObjectRequest, AsyncCallback 콜백, 객체 상태, 부울 동기화 됨)의 Amazon.S3.AmazonS3Client.PutObject에서 의 콜백, 객체 상태, 부울 동기화, (PutObjectRequest putObjectRequest) Amazon.S3.Transfer.Internal.SimpleUploadCommand.Execute() Amazon.S3.Transfer.TransferUtility.UploadHelper (TransferUtilityUploadRequest 요청)에서 Amazon.S3.Transfer.TransferUtility.UploadDirectory에서 Amazon.S3.Transfer.TransferUtility.UploadDirectoryHelper (TransferUtilityUploadDirectoryRequest 요청)에 Amazon.S3.Transfer.Internal.UploadDirectoryCommand.Execute() (TransferUtilityUploadDirectoryRequest 요청)에 5,myFileSys.CopyLargeDirectoryFromLocal에서 myModule.Global.UploadDocFolderThread에서 myFileSys.MoveLargeDirectoryFromLocal (문자열 strSrcFolderName, 문자열 strDestFolderName) 에서 (문자열 strSrcFolderName, 문자열 strDestFolderName) (개체 상태) "예외를 처리하는 것은 내가되도록 타이머를 다시 시작 반면

2] 업로드 스레드가 디렉토리 업로드를 다시 시작하지만 ti 메르는 예외 이후에 이득을 시작하지 않는 것 같습니다.

아래 코드를 붙여 넣었습니다. 이 점과 관련하여 도움이 될 것입니다.

미리 감사드립니다.

public class myClass 
{ 
    private static System.Threading.Timer UpLoadTimer; 
    private object S3_UploadStarted = null; 

    myClass() 
    { 
     S3_UploadStarted = new bool(); 
    } 

    private void BeginUpload()  //it is called when app starts 
    { 
     StartS3UploadTimer(); 
    } 

    private void StartS3UploadTimer() 
    { 
     S3_UploadStarted = false; 
     UpLoadTimer = new System.Threading.Timer(UploadDocFolderThread, null, 0,  10000); 
    } 


    private void UploadDocFolderThread() 
    { 
     try 
     { 
      if (Monitor.TryEnter(S3_UploadStarted)) 
      { 
       using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\UploadEvent.txt", true)) 
       { 
        file.WriteLine("*** Upload event occured,upload thread started ***"); 
        file.WriteLine(string.Format("*** {0:HH:mm:ss tt} ***", DateTime.Now)); 
       } 

       var docDirectory = ConfigurationManager.AppSettings["DocDirPath"]; 
       var strNameList = Directory.GetDirectories(docDirectory); 

       foreach (string strScrPath in strNameList) 
       { 
        if (string.IsNullOrWhiteSpace(strScrPath) || !System.IO.Directory.Exists(strScrPath)) 
         continue; 

        int iIndex = strScrPath.LastIndexOf("\\"); 
        if (iIndex > 0) 
        { 
         string strDesFolder = strScrPath.Substring(++iIndex); 
         if (myFileSys.IsFolderExist(strDesFolder)) 
          myFileSys.DeleteFolder(strDesFolder); 
         strDesFolder = ConfigurationManager.AppSettings["AWSClient"] + "/" + strDesFolder; 
         myFileSys.MoveLargeDirectoryFromLocal(strScrPath, strDesFolder); 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      using (System.IO.StreamWriter file = new System.IO.StreamWriter(ConfigurationManager.AppSettings["S3-UploadErrorLog"], true)) 
      { 
       file.WriteLine(string.Format("Message --> {0} - StackTrace --> {1}", ex.Message, ex.StackTrace)); 
       file.WriteLine(string.Format("*** {0:HH:mm:ss tt} ***", DateTime.Now)); 
      } 
     } 

     finally 
     { 
      using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\UploadEvent.txt", true)) 
      { 
       file.WriteLine("*** Executing finally block ***"); 
       file.WriteLine(string.Format("*** {0:HH:mm:ss tt} ***", DateTime.Now)); 
      } 

      Monitor.Exit(S3_UploadStarted);   //Exit the flag 
      StartS3UploadTimer();     //restart timer 
     } 

     } 
} 

myFileSys 
{ 
    public static bool MoveLargeDirectoryFromLocal(String strSrcFolderName, String strDestFolderName) 
    { 
     CopyLargeDirectoryFromLocal(strSrcFolderName, strDestFolderName); 
     Directory.Delete(strSrcFolderName, true); 
     return true; 
    } 

    public static bool CopyLargeDirectoryFromLocal(String strSrcFolderName, String strDestFolderName) 
    { 
     TransferUtility directoryTransferUtility = new TransferUtility(CreateAmazonS3Client()); 
     TransferUtilityUploadDirectoryRequest request = new TransferUtilityUploadDirectoryRequest 
      { 
       BucketName = bucketName, 
       Directory = strSrcFolderName, 
       KeyPrefix = strDestFolderName, 
       SearchOption = SearchOption.AllDirectories, 
       SearchPattern = "*.*" 
      }; 

     directoryTransferUtility.UploadDirectory(request); 
     return true; 
    } 
} 
+0

당신은'Monitor.TryEnter'을하지만, 아무데도 당신이'Monitor.Exit'을하지 않는다. 자물쇠는 절대 지워지지 않으므로 따라 오는 다음 스레드는 그것을 얻을 수 없습니다. –

+0

@JimMischel가 답장을 보내 주셔서 감사합니다. 코드에 필요한 변경을가했지만 실행하려고 시도했지만 문제가 동일하게 유지됩니다 ** ** 문제 상황에 위와 같은 오류가 발생합니다 ** ' 개인 무효 UploadDocFolderThread() { \t \t \t \t { \t \t \t 시도 (Monitor.TryEnter (S3_UploadStarted)) \t \t \t { \t \t \t,321 경우 // 0 상동 \t \t \t \t \t }} \t \t 캐치 (예외 예) 마지막 \t \t \t \t} \t \t \t \t { \t 위와 \t \t 동일한 {// // 위와 동일 \t \t \t Monitor.Exit (S3_UploadStarted); // 플래그를 종료하십시오. \t \t \t StartS3UploadTimer(); \t \t} } – newbieAnandy

+0

@JimMischel sir 코드를 편집했습니다. – newbieAnandy

답변

0

당신이 Monitor.Exit을 시도 shud ........