0

私は .NET を勉強していますが、今は ASP .NET MVC 4 を使った Web 開発を学んでいます。

タスクを作成しました:

Task t = new Task(new Action(() =>
        {
            while (convert("suitandtie.mp4") != 1)
            {
                if (i == 4)
                {
                     // Here I want to access in mainthread property
                     // I need to change text for viewBag like :
                     // ViewBag.Message = "Convert failed";
                     // But I need a Dispatcher and invoke for accessing 
                     // the ViewBag of the mainthread

                    break;
                }
                i++;
            }
        }));
        t.Start();

.Net アプリケーションでは、System.Windows.Threading.Dispatcher を使用して呼び出し呼び出しに使用できます。私は自分のアプリケーションでそれをしました:

 this.Dispatcher.Invoke(new Action(() =>
  {
      ContactBook.Add(Person("Mark", "232 521 424"));
  }));

連絡帳にマークを追加すると、タスクによって作成されたスレッドではなく、メインスレッドの連絡帳に追加されました。

メインスレッドの ViewBag.Message にアクセスするのを手伝ってください。

4

3 に答える 3

0

Viewbag (およびすべてのページ状態) は、応答がクライアントに送信される前にのみ使用できます。これは、従来の Web サーバー モデルの仕組みです。クライアントが URL を要求し、サーバーが何か (HTML、javascript、オクテット ストリームなど) に応答します。

個人的には、従来の ASP.NET MVC アクションを使用して最初のページを読み込み、その後の JavaScript 要求を通じて長時間のタスクを開始します。

タスクを実行するには、SignalRなどを使用して、クライアントとサーバー間の二重通信を実行できるようにします。SignalR を使用すると、サーバーはタスクの終了時にかなり簡単にクライアントに通知できます。また、ASP.NET MVC アプリでの使用は非常に簡単です。

于 2013-04-03T14:40:42.413 に答える
0

マッピングはありません。応答は [潜在的に] 既に送信されており、その時点で接続が閉じられているため、応答と対話する手段はありません。

非同期操作を開始し、その操作をブロックする要求のコンテキストに何かがない場合、その非同期操作は応答とまったく対話できません。

実行できる最善の方法は、生成した結果を何らかの外部ストレージ メカニズム (データベースなど) に格納して、サーバーからの将来の要求で情報を取得してクライアントに送信できるようにすることです。

于 2013-04-03T14:33:12.813 に答える
0

なぜそれを別のスレッドとして作成する必要があるのですか?

クライアントが aysn 呼び出しを行っていない限り、それを行うメリットはありませんが、同時に多くのことを行ったり、コントローラーの実行を他のサービスに延期したりすることはありません。

現在の Thread を ViewBag に渡すのが最も簡単な方法です。

于 2013-04-03T14:03:36.893 に答える