我是線程新手,並且在此問題上停留在此處。我有一個應用程序,我正在使用多線程。我有一個上傳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).aspx);這就是你得到錯誤的原因。您需要使用TPL來代替,如下面的答案中所述。 – GolfWolf
製作一種隊列,限制你一次可以下載多少東西。也許嘗試使用任務而不是線程,這樣你可以知道它們何時完成 – Robert
任何使用多於(8 * logical_processors)線程的Windows進程將無法執行或縮放。例如,具有使用多於8個線程來處理請求(例如套接字接受)的服務應用程序的單個CPU系統將迅速將該框放在膝蓋上。 –