2017-07-12 17 views
0

私はこのコードをXamarinアプリケーションで使用しています。しかし、これはC#の質問の多くのため、これはより良い場所ですと思った。私はあなたが写真を撮るアプリケーションを持っていて、彼らはリストに追加され、サーバーにアップロードされます。以下のコードは、画像をアップロードするために使用されるものです。サーバーに画像を送信するために5秒ごとに実行されるタイマーです(毎回OKレスポンスを受け取ると、画像はリストから削除されます)。アプリが過度に使用された後にクラッシュする理由を明らかにしていませんか?C#イメージのアップロード時にメモリリーク?

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はクリアされます。

ありがとうございます!

+0

コードの先頭ブロックは現在のコードですか?または下のもの? – mjwills

+1

「クラッシュ」を定義します。 –

+1

サイドノートでは、リクエストごとにHttpClientを新規に作成するのは貧弱な方法です。あなたはそれを変えたいと思うでしょう。 [here](https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/) – maccettura

答えて

0

ファイルをアップロードするたびに新しいHttpClientをインスタンス化しています。 HttpClientは使い捨てですが、可能な限り1つのHttpClientインスタンスを再利用する必要があります。 詳細については、thisの記事を参照してください。

問題の原因が正確かはっきりしていないので、私は分かりませんが、実際に問題を起こす可能性があります。

関連する問題