이 글에 실을 새 것으로 여기고 있습니다. 멀티 스레딩을 사용하는 응용 프로그램이 있습니다. 나는 ftp 서버에 심상의 수천을 올려주기하는 기능이있다. 각 이미지마다 새 스레드를 만듭니다. 이 스레드는 ftp 서버에 연결하는 함수를 호출하고 파일을 업로드하고 성공적으로 업로드되면 부울 값을 반환합니다.C에서 멀티 스레드를 사용하는 동안 예외가 발생했습니다.
내 문제는 내가 수천 개의 이미지를 업로드하고 각각 자체 스레드를 만들고 있기 때문에 언젠가 메모리 부족 예외와 응용 프로그램이 멈추는 경우입니다.
내 코드는 다음과 같습니다
public Int16 UploadFiles(string[] files)
{
foreach (var fileName in files)
{
if (UploadFile(fileName))
{
strLogText += "\r\n\tFile: " + fileName + " downloaded.";
}
}
}
private bool UploadFile(string fileName)
{
var blnDownload = false;
var thread = new Thread(() => DownLoadFileNow(fileName, out blnDownload)) {IsBackground = true};
thread.Start();
return blnDownload;
}
private void DownLoadFileNow(string fileName, out bool blnDownload)
{
//Get file path and name on source ftp server
var srcFolder = GetSrcFolderName(fileName);
//Get Local Folder Name for downloaded files
var trgFolder = GetLocalFolder(fileName, "D");
var reqFtp =
(FtpWebRequest) WebRequest.Create(new Uri("ftp://" + _strSourceFtpurl + srcFolder + "/" + fileName));
reqFtp.Method = WebRequestMethods.Ftp.DownloadFile;
reqFtp.UseBinary = true;
reqFtp.Credentials = new NetworkCredential(_strSourceFtpUser, _strSourceFtpPassword);
var outputStream = new FileStream(trgFolder + "\\" + fileName, FileMode.Create);
try
{
var response = (FtpWebResponse) reqFtp.GetResponse();
var ftpStream = response.GetResponseStream();
const int bufferSize = 2048;
var buffer = new byte[bufferSize];
if (ftpStream != null)
{
int readCount = ftpStream.Read(buffer, 0, bufferSize);
while (readCount > 0)
{
outputStream.Write(buffer, 0, readCount);
readCount = ftpStream.Read(buffer, 0, bufferSize);
}
ftpStream.Close();
}
response.Close();
blnDownload = true;
}
catch (WebException ex)
{
_log.WriteLog("Error in Downloading File (" + fileName + "):\r\n\t" + ex.Message, "");
//Delete newly created file from local system
outputStream.Close();
if (File.Exists(trgFolder + "/" + fileName))
File.Delete(trgFolder + "/" + fileName);
}
catch (Exception ex)
{
_log.WriteLog("Error in Downloading File (" + fileName + "):\r\n\t" + ex.Message, "");
}
finally
{
outputStream.Close();
outputStream.Dispose();
}
blnDownload = false;
}
도움이 나를 한 번에 실행하지 않는 이상 10-20 이상의 스레드가되도록 내가 스레드의 수가 생성되는 제한 할 수있는 방법을 알려 주시기 바랍니다.
[스레드가 1MB의 메모리를 사용합니다] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms686774(v=vs.85)asp)); 그래서 당신은 오류가 발생합니다. 아래 답변에서 제안 된 것처럼 대신 TPL을 사용해야합니다. – GolfWolf
한 번에 다운로드 할 수있는 항목 수를 제한하는 대기열을 만드십시오. 어쩌면 스레드 대신 Tasks를 사용하여 작업이 끝났음을 알 수 있습니다. – Robert
스레드가 8 개 이상 (logical_processors) 사용하는 Windows 프로세스는 수행 또는 크기 조정이 실패합니다. 예를 들어, 요청을 처리하기 위해 8 개 이상의 스레드를 사용하는 서비스 응용 프로그램이있는 단일 CPU 시스템 (예 : 소켓 수락)은 상자를 신속하게 무릎으로 가져갑니다. –