2012-04-27 100 views
1

我試圖將我的服務器上的視頻直接上傳到YouTube。當用戶添加視頻時,它會被複制到YouTube。在VB.NET中用於YouTube DirectUpload的BackgroundWorker?

添加視頻的用戶操作應該開始上傳過程,這可能需要一段時間。這種形式,即使是異步形式,也不應該坐在那裏等待這種情況發生。它應該剛剛開始,並允許用戶繼續前進,相信它正在後臺處理。

爲了做到這一點,我試圖使用system.threading.backgroundworker。我希望這個過程能夠開始,網絡應用程序將繼續前進。不是。它正在掛起,無論是異步還是完整回發,並且在返回並更新lblmsg.text之前等待上傳完成。

是否有不同的方式我應該去做這件事,所以用戶可以啓動上傳程序,而不是等待它完成?這是我到目前爲止的代碼:

Sub up_load(s As Object, e As EventArgs) 
    Dim worker As BackgroundWorker = New BackgroundWorker 

    worker.WorkerReportsProgress = True 
    worker.WorkerSupportsCancellation = True 
    AddHandler (worker.DoWork), AddressOf begin_upload 

    'call this and move on? 
    worker.RunWorkerAsync() 

    lblmsg.Text = "Successfully initiated upload" 

End Sub 

Sub begin_upload(s As Object, e As DoWorkEventArgs) 

    Dim request As New YouTubeRequest(settings) 
    Dim vidupload As New Video() 

    vidupload.Title = "My Big Test Movie" 
    vidupload.Tags.Add(New MediaCategory("Nonprofit", YouTubeNameTable.CategorySchema)) 
    vidupload.Keywords = "church, jesus" 
    vidupload.Description = "See the entire video" 
    vidupload.YouTubeEntry.Private = False 
    vidupload.YouTubeEntry.setYouTubeExtension("location", "Downers Grove, IL") 
    vidupload.YouTubeEntry.MediaSource = New MediaFileSource("c:\users\greg\test3.asf", "video/x-ms-wmv") 

    Dim createdVideo As Video = Request.Upload(vidupload) 
End Sub 

回答

0

你可能想看看進入Task Parallel Library添加多線程代碼。既然你提供的代碼:

添加此import語句

Imports System.Threading.Tasks 

而這個簡單的語句來替換所有BackgroundWorker的邏輯:

Dim uploadTask As Task = Task.Factory.StartNew(Sub() 
                 Dim request As New YouTubeRequest(settings) 
                 Dim vidupload As New Video() 

                 vidupload.Title = "My Big Test Movie" 
                 vidupload.Tags.Add(New MediaCategory("Nonprofit", YouTubeNameTable.CategorySchema)) 
                 vidupload.Keywords = "church, jesus" 
                 vidupload.Description = "See the entire video" 
                 vidupload.YouTubeEntry.Private = False 
                 vidupload.YouTubeEntry.setYouTubeExtension("location", "Downers Grove, IL") 
                 vidupload.YouTubeEntry.MediaSource = New MediaFileSource("c:\users\greg\test3.asf", "video/x-ms-wmv") 

                 Dim createdVideo As Video = request.Upload(vidupload) 
                End Sub) 

現在你有uploadTask上傳視頻的背景並且您的UI線程將可以自由處理其他代碼。如果你想要取消和進度報告,它會變得更加複雜,但是頂部的鏈接應該讓你開始。

+0

謝謝!這絕對是更接近一步。它在後臺啓動進程並返回,但在YouTube端數分鐘後,我收到「失敗,上傳已中止」。它會保持這個過程直到它完成,還是我不得不擔心回收或超時或什麼? – gbusman 2012-04-28 16:57:07

+0

更新:嘗試在創建任務時使用LongRunning選項,仍然中止並在75MB文件上傳失敗。 – gbusman 2012-04-28 17:40:45

+0

有趣...我沒有意識到任何默認超時,所以我相信YouTube的API是責備。 TPL設計時考慮到了簡單性,因此您不必擔心管理線程等問題。 – 2012-04-28 20:08:17