Multithreading C#.Net MVC线程中的共享变量

Multithreading C#.Net MVC线程中的共享变量,multithreading,asp.net-mvc-3,c#-4.0,delegates,shared-memory,Multithreading,Asp.net Mvc 3,C# 4.0,Delegates,Shared Memory,我正在将视频上传到.NETMVC应用程序中的服务器。因为这是需要一些时间,我在后台线程做。另一方面,我正在跟踪上传进度并将其显示给用户 这是我的密码 public class MyController : Controller { long chunkSize = 256 * 1024; private static string _progress = ""; //if I make nonstatic it fails //.......... //Som

我正在将视频上传到.NETMVC应用程序中的服务器。因为这是需要一些时间,我在后台线程做。另一方面,我正在跟踪上传进度并将其显示给用户

这是我的密码

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); 
    }
}
公共类MyController:Controller
{
长chunkSize=256*1024;
私有静态字符串_progress=“;//如果我设置为非静态,它将失败
//..........
//这里有一些代码
//..........
//上传文件请求
公共操作结果视频上载程序()
{
var client=(VimeoClient)会话[“client”];
票证t=client.vimeo_videos_upload_getTicket();
字符串路径=@“E:\d2.MOV”;//用于测试的硬编码值
新线程(()=>Transfer(client,t,path)).Start();//在后台将文件推送到服务器
返回PartialView(“U进度”、“准备上载…”);
}
//工作线程
私有无效传输(VimeoClient客户端,票据t,字符串路径)
{
FileInfo UploadFile=新FileInfo(路径);
int chunks=(int)Math.Floor(Convert.ToDouble(UploadFile.Length/chunkSize));

对于(int i=0;i您应该将某种类型的“操作ID”作为原始响应的一部分返回给客户端。
Progress
方法应该将此操作ID作为参数。然后,上载服务应该根据该操作ID存储其进度(例如,在数据库中,以允许您水平缩放)


基本上,您应该想象涉及多个传输的情况-您需要某种方法来获得正确传输的进度。

MyController的实例是根据请求创建的

在旋转工作线程之后,将页面返回给客户端,该实例就消失了

您可以像这样将
(即控制器实例)传递给
传输
方法

private void Transfer(MyController controller,
                                       VimeoClient client, Ticket t, string path)
{
    controller._progress
新线程(()=>传输(this,client,t,path)).Start();

然后访问
Transfer
方法中的_progress变量,如下所示

private void Transfer(MyController controller,
                                       VimeoClient client, Ticket t, string path)
{
    controller._progress
页面已经返回,因此您只能访问instance\u progress字段,但是如何更新客户端

你也可以

  • 在视图中返回动画gif,并使用javascript或
  • 使用类似于“推送”进度更新到客户端的库

收到“VideoUploader”请求后,我使用私有“Transfer”方法在后台推送文件,并返回PartialView。在“Transer”函数中,我正在更新“\u progress”值。返回的PartaiView定期调用“progress”操作以获取在“Transfer”方法中更新的当前进度值。因为“\u progress”ess'是一个静态的,它正在工作。但是两个用户同时上传文件'\u progress'值变得疯狂,这很明显是因为它是共享的。所以我想将'\u progress'设置为非静态的。但是在这种情况下,值总是空的。如果传递MyController实例,共享将无法工作(此)正如我所建议的,对于线程函数,每个requestthanx Bond都有一个实例。但问题是如何在“Progress”操作中访问MyCantoller insatnce。
public ActionResult Progress(){//返回更新的共享“\u Progress”varibal返回Json(\u Progress,JsonRequestBehavior.AllowGet);}
你不能从那里开始,你必须按照Jon的建议去做——存储每个客户端的上传信息,并让进度操作有一个指向该存储的键,你给客户端一个键,查看你的视频上传操作。