C# 上传图像时内存泄漏?
我有一个Xamarin应用程序使用的代码。但我认为这是一个更好的提问的地方,因为这更像是一个C#问题。我有一个应用程序,你可以在其中拍照,然后将照片添加到列表并上传到服务器。下面的代码是用来上传图像的,有一个计时器,每5秒运行一次,向服务器发送一个图像(一旦收到OK响应,每次都是这样),它从列表中删除图像,我是否错过了一些明显的东西,为什么过度使用应用程序后会崩溃C# 上传图像时内存泄漏?,c#,C#,我有一个Xamarin应用程序使用的代码。但我认为这是一个更好的提问的地方,因为这更像是一个C#问题。我有一个应用程序,你可以在其中拍照,然后将照片添加到列表并上传到服务器。下面的代码是用来上传图像的,有一个计时器,每5秒运行一次,向服务器发送一个图像(一旦收到OK响应,每次都是这样),它从列表中删除图像,我是否错过了一些明显的东西,为什么过度使用应用程序后会崩溃 public App() { DB = new DataAccess(URL);
public App()
{
DB = new DataAccess(URL);
MainPage = new NavigationPage(new Landing()) { BarTextColor = Color.White };
Device.StartTimer(TimeSpan.FromSeconds(5), () =>
{
if (imagesToUpload.Count != 0)
{
CallFileToServer();
}
return true;
});
}
private async void CallFileToServer()
{
await SendFileToServer(imagesToUpload.FirstOrDefault().imageBytes, imagesToUpload.FirstOrDefault().shipmentNum);
}
private async Task SendFileToServer(byte[] image, string shipmentNumber)
{
try
{
Uri webService = new Uri(URL + "imageUpload/" + shipmentNumber);
using (var client = new HttpClient(new NativeMessageHandler()))
{
using (var content = new MultipartFormDataContent("----MyGreatBoundary"))
{
using (var memoryStream = new MemoryStream(image))
{
content.Add(new StreamContent(memoryStream), "file", Guid.NewGuid().ToString() + ".jpg");
using (var message = await client.PostAsync(webService, content))
{
string response = await message.Content.ReadAsStringAsync();
if (message.ReasonPhrase.ToLower() == "OK".ToLower())
{
imagesToUpload.Remove(imagesToUpload.FirstOrDefault(f => f.imageBytes == image));
}
}
}
}
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
这是将图像添加到列表代码中的过程,但是我事先问了一个类似的问题,我被告知这很可能不是问题所在
using (var memoryStream = new MemoryStream())
{
file.GetStream().CopyTo(memoryStream);
App.imagesToUpload.Add(new ImageToUpload
{
imageBytes = memoryStream.ToArray(),
shipmentNum = Result.ToString(),
imageData = ImageSource.FromFile(file.Path)
});
tempCollection.Add(new TempImage
{
imgSource = ImageSource.FromFile(file.Path)
});
file.Dispose();
memoryStream.Dispose();
}
提交表单后,TempCollection将被清除,因此列表不是问题所在
提前谢谢 我看到您每次上传文件时都在实例化一个新的HttpClient。 尽管HttpClient是一次性的,但是您应该尽可能地重复使用单个HttpClient实例。 有关更多信息,请参阅文章
我不知道这是否是您的问题的原因,因为您对出现的确切问题含糊不清,但您可以试一试。最上面的代码块是您当前的代码吗?还是最下面的一个?定义“崩溃”。请注意,为每个请求创建一个新的HttpClient是一种糟糕的做法。你会想改变的。请看一个明显的潜在原因,即您在using语句之外执行了
新内存流(图像)
。它可能会被传递到的StreamContent
处理掉,但我没有证据表明这一点。。。出于好奇,在尝试诊断内存问题时,您是否确实查看了创建内存流的位置?另一个明显的潜在原因是file.GetStream().CopyTo(…)
语句之外使用的。此外,您不必使用
语句(即memoryStream
变量)对中的变量手动调用Dispose
。