Если вы придерживаетесь http, вы можете использовать кодирование передачи по частям и отложить отправку пакетов / кусков. Это действительно будет что-то похожее на hardcoded thread::sleep
, но вы можете использовать цикл обработки событий, чтобы определить, когда отправлять следующий блок, вместо того, чтобы останавливать поток.
Вы можете столкнуться с проблемами синхронизации, возможно, ваша логика сна вызывает более длительные задержки, чем время исполнения песни. У YouTube та же логика, о которой вы говорите. Похоже, что они разбивают видео на несколько HTTP-запросов, а клиент внешнего интерфейса запрашивает новый чанк, когда буфер слишком мал. Разделение файла на несколько запросов http тела и последующая сборка их на клиенте могут иметь характеристики, которые вы ищете.
Вы можете просто реализовать http Range
заголовок и позволить клиенту запрашивать только определенный Range
mp3-файл. https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests
найденный здесь http://www.mredkj.com/vbnet/vbnetmapdrive.html
Public Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" _
( ByRef lpNetResource As NETRESOURCE, ByVal lpPassword As String, _
ByVal lpUserName As String, ByVal dwFlags As Integer) As Integer
Public Declare Function WNetCancelConnection2 Lib "mpr" Alias "WNetCancelConnection2A" _
(ByVal lpName As String, ByVal dwFlags As Integer, ByVal fForce As Integer) As Integer
<StructLayout(LayoutKind.Sequential)> _
Public Structure NETRESOURCE
Public dwScope As Integer
Public dwType As Integer
Public dwDisplayType As Integer
Public dwUsage As Integer
Public lpLocalName As String
Public lpRemoteName As String
Public lpComment As String
Public lpProvider As String
End Structure
Public Const ForceDisconnect As Integer = 1
Public Const RESOURCETYPE_DISK As Long = &H1
Public Function MapDrive(ByVal DriveLetter As String, ByVal UNCPath As String) As Boolean
Dim nr As NETRESOURCE
Dim strUsername As String
Dim strPassword As String
nr = New NETRESOURCE
nr.lpRemoteName = UNCPath
nr.lpLocalName = DriveLetter & ":"
strUsername = Nothing '(add parameters to pass this if necessary)
strPassword = Nothing '(add parameters to pass this if necessary)
nr.dwType = RESOURCETYPE_DISK
Dim result As Integer
result = WNetAddConnection2(nr, strPassword, strUsername, 0)
If result = 0 Then
Return True
Else
Return False
End If
End Function
Public Function UnMapDrive(ByVal DriveLetter As String) As Boolean
Dim rc As Integer
rc = WNetCancelConnection2(DriveLetter & ":", 0, ForceDisconnect)
If rc = 0 Then
Return True
Else
Return False
End If
End Function
одно решение состояло бы в том, чтобы отобразить сетевую папку на доступную букву диска. Вы могли выполнить тот Windows OS использования команды:
System.Diagnostics.Process.Start("net.exe", "use K: \\Server\URI\path\here /USER:<username> <password>" )
Просто замените имя пользователя и пароль с учетными данными, в которых Вы нуждаетесь и удостоверяетесь, что буква диска доступна.
Разъединять Вас может звонить
System.Diagnostics.Process.Start("net.exe", "use /delete K:" )