我正在使用.NET Framework 3.5 SP1在VB.NET中使用Windows Media Player 12(wmp.dll)提供的WMPLib组件。
我正在尝试根据媒体库的名称从媒体库中检索媒体项(假设没有重复的名称)。目前,我正在抓取整个媒体库,并遍历每个媒体项目,并在找到正确的媒体项目时退出循环。这很有效(除了找不到具有该名称的媒体项目),但我希望有一种更有效的方法。
到目前为止,这是我的代码:
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()来完成它的工作而不需要遍历整个媒体库(这可能是巨大的)的方法。任何人都有线索?
答案 0 :(得分:1)
考虑如何尝试进行更快速的搜索。我可能会创建一对背景工作者,然后从0到allTracks.count - 在其中一个工作者中迭代,然后在另一个工作程序中迭代,从allTracks.count迭代 - 1到0.然后,无论哪个先到达它,在RunWorkerCompleted事件中,您可以取消对其他worker的异步。这可能会将搜索时间缩短一半。
您还可以通过将(计数-1)除以4(25%)同时在列表的四分之一上运行循环,然后您可以将它从(计数-1)中减去75%,然后向上或向下迭代在另一对异步工人的中途点。这可能会将您的搜索时间减少到之前等待的25%。
我看到你正在创建一个类来支持你在对象中搜索,我不知道Backgroundworkers是否实际上在类内部运行,所以我可以离开。
只是一个想法。我之前没有做过这样的事情,所以我可能会比它需要的更努力。祝好运!让我知道你发现了什么。
编辑:如果你选择后台工作者,我认为你需要在for循环中包含这些代码:
If BackgroundWorker1.CancellationPending Then
Exit For
End If
答案 1 :(得分:0)
只需使用getByName界面的“IWMPMediaCollection”方法;)