을 통해 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;
}
}
당신은'Monitor.TryEnter'을하지만, 아무데도 당신이'Monitor.Exit'을하지 않는다. 자물쇠는 절대 지워지지 않으므로 따라 오는 다음 스레드는 그것을 얻을 수 없습니다. –
@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
@JimMischel sir 코드를 편집했습니다. – newbieAnandy