1

.Net MVC アプリケーションでサーバーに動画をアップロードしています。時間がかかるので、バックグラウンド スレッドで実行しています。一方、アップロードの進行状況を追跡し、ユーザーに表示しています。

これが私のコードです

public class MyController : Controller
{
    long chunkSize = 256 * 1024;
    private static string _progress = ""; //if I make nonstatic it fails 

    //..........
    //Some codes here
    //..........

    //Upload file Request
    public ActionResult VideoUploader()
    {
        var client = (VimeoClient)Session["client"];
        Ticket t = client.vimeo_videos_upload_getTicket();

        string path = @"E:\d2.MOV"; //Hardcoded value for testing purposes

        new Thread(() => Transfer(client, t, path)).Start(); //Push file to server in background

        return PartialView("_progress", "Preparing to upload...");
    }

    //Worker Thread
    private void Transfer(VimeoClient client, Ticket t, string path)
    {
        FileInfo UploadFile = new FileInfo(path);

        int chunks = (int)Math.Floor(Convert.ToDouble(UploadFile.Length / chunkSize)); 

        for (int i = 0; i <= chunks; i++)
        {
            string output = client.PostVideo(t, i, path,(int) chunkSize);

            var v = client.vimeo_videos_upload_verifyChunks(t);

            double percentage = (Convert.ToDouble(i + 1) / (chunks + 1)) * 100;

            _progress = percentage.ToString() + "%"; // value sharing between two actions

        }

        string name = client.vimeo_videos_upload_complete(path, t);
        client.vimeo_videos_embed_setPreset(client.Token, "200772", name);
    }

    //This method is calling from front end using jQuery to display progress
    public ActionResult Progress()
    {
            //returning updated shared "_progress" varibal
        return Json(_progress, JsonRequestBehavior.AllowGet); 
    }
}

私の問題は、「_progress」を非静的変数( private static _progress)にしたときに機能しないことです。値は常に空です。

私がしようとしているのは_progress、メインスレッドと新しいスレッドの間で変数を共有することです。しかし、静的でない場合は失敗しています。

修正するのを手伝ってください。より良いオプションがある場合は、共有してください

前もって感謝します

4

2 に答える 2

2

元の応答の一部として、ある種の「操作 ID」をクライアントに返す必要があります。Progressメソッドは、この操作 ID をパラメーターとして受け取る必要があります。アップロード サービスは、その進行状況をその操作 ID に対して保存する必要があります (たとえば、水平方向にスケーリングできるようにデータベースに格納します)。

基本的に、複数の転送が含まれる状況を想像する必要があります。適切な転送の進行状況を取得する何らかの方法が必要です。

于 2012-07-20T07:42:01.627 に答える
1

のインスタンスはMyControllerリクエストごとに作成されます。

ワーカー スレッドをスピンした後、ページをクライアントに返すと、そのインスタンスはなくなります。

このようにメソッドthisに(つまり、コントローラーインスタンス)を渡すことができますTransfer

new Thread(() => Transfer(this, client, t, path)).Start();

Transfer次に、このようなメソッドで _progress 変数にアクセスします

private void Transfer(MyController controller,
                                       VimeoClient client, Ticket t, string path)
{
    controller._progress

ページは既に返されているため、インスタンスの _progress フィールドにアクセスすることしかできませんが、クライアントを更新するにはどうすればよいでしょうか?

あなたはどちらかをすることができます

  • ビューでアニメーション GIF を返し、javascript OR を使用して定期的にサーバーにリクエストを送信します
  • SignalRのようなライブラリを使用して、進行状況の更新をクライアントに「プッシュ」します
于 2012-07-20T07:54:35.473 に答える