yohan.jayarathna
yohan.jayarathna

Reputation: 3463

Shared Variable in C# .Net MVC Thread

I am uploading videos to server in .Net MVC application. Since it is takes some time I am doing in a background thread. On the other hand I am tracking the upload progress and display it to the user.

Here is my code

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); 
    }
}

My problem is when I made "_progress" nonstatic variable(private static _progress) it is not working. Value is always empty.

What I trying to do is share _progress variable between main thread and new thread. But it is failing when it nonstatic.

Please help me to correct. If you have a better option please share

Thanks in advance

Upvotes: 1

Views: 1115

Answers (2)

Ventsyslav Raikov
Ventsyslav Raikov

Reputation: 7202

Instance of MyController is created per request.

After you spin the worker thread you return the page to the client and that instance is gone.

You can pass this(i.e. the controller instance) to the Transfer method like this

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

and then access the _progress variable in the Transfer method like this

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

the page is already returned, so you'll just be able to access the instance _progress field, but then how do you update the client?

you can either

  • return in the view an animated gif and make a periodical request to the server with javascript OR
  • use a library like SignalR to 'push' the progress update to the client

Upvotes: 1

Jon Skeet
Jon Skeet

Reputation: 1502466

You should be returning some sort of "operation ID" to the client as part of the original response. The Progress method should then take this operation ID as a parameter. The upload service should then store its progress against that operation ID (e.g. in a database, to allow you to scale horizontally).

Basically, you should imagine the situation where there are multiple transfers involved - you need some way of getting the progress for the right transfer.

Upvotes: 2

Related Questions