C# 上传图像时内存泄漏?

C# 上传图像时内存泄漏?,c#,C#,我有一个Xamarin应用程序使用的代码。但我认为这是一个更好的提问的地方,因为这更像是一个C#问题。我有一个应用程序,你可以在其中拍照,然后将照片添加到列表并上传到服务器。下面的代码是用来上传图像的,有一个计时器,每5秒运行一次,向服务器发送一个图像(一旦收到OK响应,每次都是这样),它从列表中删除图像,我是否错过了一些明显的东西,为什么过度使用应用程序后会崩溃 public App() { DB = new DataAccess(URL);

我有一个Xamarin应用程序使用的代码。但我认为这是一个更好的提问的地方,因为这更像是一个C#问题。我有一个应用程序,你可以在其中拍照,然后将照片添加到列表并上传到服务器。下面的代码是用来上传图像的,有一个计时器,每5秒运行一次,向服务器发送一个图像(一旦收到OK响应,每次都是这样),它从列表中删除图像,我是否错过了一些明显的东西,为什么过度使用应用程序后会崩溃

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