2010-04-25 79 views
0

我在.NET Framework 3.5 SP1的VB.NET中搞乱了Windows Media Player 12(wmp.dll)提供的WMPLib组件。更有效的在WMP媒体库中查找媒体项目的方法?

我试图从我的媒体库中根据其名称检索媒体项目(假设没有重复的名称)。目前,我正在抓取整个媒体库,并循环播放每个媒体项目,并在找到正确的媒体项目时退出循环。这很有效(除了找不到具有该名称的媒体项目时),但我希望有一种更有效的方式来做到这一点。

这是到目前为止我的代码:

Public Class WMPTest 
    Private myWMP As WMPLib.IWMPCore 
    Private myMediaCollection As WMPLib.IWMPMediaCollection 
    Private myTrack As WMPLib.IWMPMedia 
    Private allTracks As WMPLib.IWMPPlaylist 

    Public Sub New() 
     ' This call is required by the Windows Form Designer. 
     InitializeComponent() 

     ' Add any initialization after the InitializeComponent() call. 
     myWMP = New WMPLib.WindowsMediaPlayer 
     myMediaCollection = myWMP.mediaCollection 
     allTracks = myMediaCollection.getAll 

     Dim theTrack As WMPLib.IWMPMedia = findTrack("Yellow Submarine") 
     MessageBox.Show(theTrack.name) 
    End Sub 

    Public Function findTrack(ByVal strTrackName As String) As WMPLib.IWMPMedia 
     For i As Integer = 0 To (allTracks.count - 1) 
      If allTracks.Item(i).name = strTrackName Then 
       myTrack = allTracks.Item(i) 
       Exit For 
      End If 
     Next 
     'myTrack is now the track that we wanted to retrieve 
     Return myTrack 
    End Function 
End Class 

所以我真正想要的是优化findTrack()做它的事,而不在整个媒体库循环(这可能是巨大的)的方式。任何人都有线索?

回答

1

只是想我可能会尝试进行更快的搜索。我可能会创建一对夫妇Background Workers,然后遍历从0到allTracks.count - 1在其中一个worker中,然后在另一个worker中,从allTracks.count - 1迭代到0。然后,无论哪个先到达, RunWorkerCompleted事件,您可以取消其他工作者的异步。这可能会将搜索时间缩短一半。

您也可以在列表的四分之一上同时运行循环,方法是将count(count -1)除以25%,然后从(count-1)中减去75%,然后迭代或直到另一对异步工作人员的中途。这可以将您的搜索时间切实减少到之前等待的25%。

我看到你正在创建一个类来支持你在对象中搜索,并且我不知道Backgroundworkers是否实际在类内部运行,所以我可以离开。

只是一个想法。我之前没有做过这样的事情,所以我可能会让事情变得更难。祝你好运!让我知道你发现了什么。

编辑:如果你有背景的工人走了,我想你会需要包括循环中的这段代码:

If BackgroundWorker1.CancellationPending Then 
    Exit For 
End If