0

我在使用 .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() 的方法来完成它的工作,而无需遍历整个媒体库(这可能是巨大的)。有人有线索吗?

4

2 回答 2

1

只是在想我如何尝试进行更快的搜索。我可能会创建几个后台工作人员,然后在其中一个工作人员中从 0 迭代到 allTracks.count - 1,然后在另一个工作人员中,从 allTracks.count - 1 向下迭代到 0。然后,无论哪个先到达,在RunWorkerCompleted 事件,您可以取消其他工作人员的异步。这可能会将搜索时间缩短一半。

您还可以同时在列表的四分之一上运行循环,方法是将 (count -1) 除以 4 得到 25%,然后你可以从 (count-1) 中减去它得到 75%,然后向上或向下迭代到一半指向另一对异步工作者。这可以将您的搜索时间减少到之前等待的 25%。

我看到你正在创建一个类来支持你在对象中的搜索,我不知道 Backgroundworkers 是否真的在类中起作用,所以我可能会离开。

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

编辑:如果您使用后台工作人员,我认为您需要在 for 循环中包含此代码:

If BackgroundWorker1.CancellationPending Then
    Exit For
End If
于 2010-04-26T20:11:23.380 回答
0

只需使用IWMPMediaCollection接口的“ getByName ”方法;)

于 2013-02-08T18:29:45.357 回答