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

时间:2017-07-12 13:48:49

标签: c#

我有这个代码,我使用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,以便列表不是问题。

提前致谢!

1 个答案:

答案 0 :(得分:0)

我发现您每次上传文件时都会实例化一个新的HttpClient。 虽然HttpClient是一次性的,但您应该尽可能多地重用一个HttpClient实例。 有关详细信息,请参阅this文章。

我不知道这是否是您出现问题的原因,因为您对所出现的确切问题一无所知,但您可能会试一试。