C# 如何终止和启动进程
本文关键字:启动 进程 终止 何终止 | 更新日期: 2023-09-27 18:37:08
在我的c#程序(使用Visual Studio 2010)中,我正在将文件上传到SharePoint文档库,问题是我正在运行我们的内存,显然进程"sqlservr.exe * 32"就像超过一GB的内存。为了上传文件,我首先将文件的字节读取到 byte[] 数组中。然后将数组作为文件上载到文档库。我需要一种方法在上传每个文件之前清除内存。
程序在循环中上传文件,该循环在目录中迭代。那么有没有办法清除 byte[] 数组的内存呢?
实际上有没有办法重新启动进程"sqlservr.exe*32"以释放内存?
这是我用来上传的代码:
我在网站上看到的错误消息是(当问题发生时,我认为是内存不足,有时消息中的文件也不同):网址"测试库/我的文件夹/文件.txt"无效。 它可能引用不存在的文件或文件夹,或者引用当前 Web 中不存在的有效文件或文件夹。
using System;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using System.IO;
using Microsoft.SharePoint;
namespace CustomApplicationPage.Layouts.CustomApplicationPage
{
public partial class CustomApplicationPage : LayoutsPageBase
{
protected void Page_Load(object sender, EventArgs e)
{
// Check if user posted a file
if (File1.PostedFile == null)
{
return;
}
try
{
// Get the directories in the path
string[] array1 = Directory.GetDirectories("C:''myfolder''");
// Declare variables
string[] temp;
byte[] contents;
string dir_name;
string file_name;
int i, j;
int chunk_size = 5;
int chunk_index = 0;
int start_id = chunk_size * chunk_index;
int end_id = 1 + (chunk_size * (chunk_index+1));
// Free the memory
GC.Collect();
// For each directory in the main path
for (i = 0; i < array1.Length; i++)
{
// Get directory name
dir_name = Path.GetFileName(array1[i]);
// Skip this file
if (dir_name == "viDesktop_files" || i < start_id || i >= end_id)
{
continue;
}
// Get the site
SPSite site = new Microsoft.SharePoint.SPSite("http://mysite/");
// Turn security off
Microsoft.SharePoint.Administration.SPWebApplication webApp = site.WebApplication;
webApp.FormDigestSettings.Enabled = false;
// Get site root
SPWeb spWeb = site.RootWeb;
// Get the specified list/library from the site root
SPList docLib = spWeb.Lists["Test Library"];
// Get all files in the directory
temp = Directory.GetFiles(array1[i]);
// Create a folder in the list/library
SPListItem folder = docLib.Folders.Add(docLib.RootFolder.ServerRelativeUrl, SPFileSystemObjectType.Folder, dir_name);
// Activate the newly created folder
folder.Update();
// For each file in the directory
for (j = 0; j < temp.Length; j++)
{
// Get file name
file_name = Path.GetFileName(temp[j]);
// If the file is a .mht file
if (file_name.EndsWith(".mht"))
{
// Read the contents of the uploaded file into the variable 'contents'
contents = File.ReadAllBytes(temp[j]);
// Add the file with the specified filename in the folder
SPFile file = folder.Folder.Files.Add(file_name, contents);
// Activate the file
file.Update();
}
}
// Turn security on
webApp.FormDigestSettings.Enabled = true;
// Close the site
site.Close();
}
}
catch (Exception ex)
{
throw ex;
}
}
}
}
释放结果并关闭连接...您可以重新启动该过程,但可能存在更大的问题...尝试使用 LINQ 和 DataContext
http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.aspx
如果您认为自己已正确设置所有内容,请尝试使用 SQL 事件探查器并查看数据库级别的情况...
http://msdn.microsoft.com/en-us/library/ms181091.aspx
尝试调用 .dispose() on site, webApp, spWeb, docLib, folder, File 和任何其他可丢弃的东西。
其他应用程序消耗的内存很可能不会导致您的应用程序收到内存不足异常。 Windows 在需要时使用虚拟内存,并将其他应用程序的内存放在页面文件中。 在 32 位进程中,您的应用程序应该有 2G 的可用内存(即使您没有那么多可用的 ram)。
从我所看到的 OutOfMemory 异常来看,它们通常是由于碎片,clr 无法为我的应用程序提供足够大的连续内存块来执行我尝试执行的操作。
无论如何,您应该从处理那些一次性的东西开始。
而且,顺便说一句...您不需要调用 GC。收集();