1

サーバー上の動画を YouTube に直接アップロードする機能を実装しようとしています。ユーザーが動画を追加すると、YouTube にコピーされます。

ユーザーが動画を追加すると、アップロード プロセスが開始されますが、これには時間がかかる場合があります。フォームは、たとえ非同期フォームであっても、そこに座ってこれが起こるのを待つべきではありません。バックグラウンドで処理されていることを信頼して、ユーザーが先に進むことができるようにする必要があります。

これを可能にするために、system.threading.backgroundworker を使用しようとしています。プロセスが開始され、Web アプリが先に進むことを願っています。そうではありません。非同期または完全なポストバックであるかどうかに関係なく、ハングしており、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
4

1 に答える 1

0

コードにマルチスレッドを追加するには、 Task Parallel Libraryを調べてください。あなたが提供したコードを考えると:

このインポートステートメントを追加

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 スレッドは他のコードを自由に処理できるようになります。キャンセルと進行状況のレポートが必要な場合は、もう少し複雑になりますが、上部のリンクから開始できます.

于 2012-04-28T02:12:58.223 に答える