2016-10-18 18 views
-6

C#を使用しているPCの音楽プレーヤーで作業していますが、すべてがうまくいくようですが、音楽ディレクトリからすべての音楽ファイルをロードする際に問題があります。アプリ、音楽ファイルの量に応じて5分かかります。これは、各音楽ファイルをループしてメタデータを取得し、それぞれの音楽ファイルごとに異なる画像ボックスにロードするループを作成したために起こると思います。
お手数ですが、私はより速くする必要があります。ありがとうございました。コードは以下の通りです ...ループ最適化C#

public List<MusicDetails> Music_Library() 
    { 


     List<MusicDetails> files = new List<MusicDetails>(); 
     string[] musicfolder = Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyMusic),"*mp3", SearchOption.AllDirectories); 


     for (int i = 0; i <musicfolder.Length; i++) 
     { 
      try { 
       files.Add(new MusicDetails 
       { 
        title = TagLib.File.Create(musicfolder[i]).Tag.Title, 
        genre = TagLib.File.Create(musicfolder[i]).Tag.FirstGenre, 
        artist = TagLib.File.Create(musicfolder[i]).Tag.FirstPerformer, 
        path = musicfolder[i], 
        CoverArt = OrganiseAlbums.SingleAlbumImage(musicfolder[i],true) 


       }); 
      }catch(Exception) 
      { 
       // OMIT FILE 
      } 
     } 
     return files; 

    } 
+6

がどのようにあなたはあなたの間違ったコードを修正するお手伝いをすることが可能であることを考えるならば、あなたドンこのコードを表示しないでください。 – Steve

+1

画像とメタデータのスタブ情報をバックグラウンドでasyncファイルにロードします。画像とメタデータを別のスレッドに読み込みます。 –

答えて

0

あなたがバックグラウンドスレッドを使用して並列foreachループを使用してループを交換してみてください - それが処理されるUIに各項目を追加し、.NETは、最も効率的な方法を決定させますすべてを処理するあなたは右のそれを行う場合は、あなたのUIは、応答性のままになり、そしてユーザーが「見て十分な...」ここから始めるでしょう、あなたが始めるためのリンクです:

https://msdn.microsoft.com/en-us/library/dd460720(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1

お持ちの場合大量の音楽ファイルを一度にすべてメモリにロードしたくない場合があります。私は何らかの種類のリストコントロールやレイアウトコントロールを調べて、仮想化を許可して、特定の時点で可視のものだけをインスタンス化して表示するようにします。チュートリアルを使用してコレクションをバインドして仮想化する方法を参照してください。あなたがしようとしているものの例でより具体的な質問を投稿する場合、あなたはより具体的な答えを得るでしょう

...

+0

ありがとう、私のコードを貼り付けていないのは申し訳ありません....これは... – kingthor

+0

これを表示するために、何らかのレイアウトコントロール(GridView、FlowLayoutPanelなど)を使用していると確信しています。そのレイアウトコントロールをコードで返すリストにバインドしているのですか、リストをループして各MusicDetailsアイテムをItemsコレクションに追加していますか? –