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 向服务器发出定期请求或
  • 使用SignalR之类的库将进度更新“推送”到客户端
于 2012-07-20T07:54:35.473 回答