2017-11-01 21 views
0

ボタンをクリックしたときに開始するタスクの現在の状態を示すラベルテキストを更新する必要があります。 タスクが開始すると、ラベルは「生成中」と表示され、終了するとラベルは「生成済み」と表示されます。それはここでASP .NET、タスク実行時の更新ページ

は私がしようとしてきたかを示すことは非常に単純化されたコードを行く....簡単なように見えた:

<asp:UpdatePanel runat="server" UpdateMode="Always"> 
    <ContentTemplate> 
    <asp:Button Id="btn1" runat="server" Text="Run" 
          OnClick="btn1_Click"/> 
    <asp:Label ID="lbl1" runat="server" Text="Not Generated"/> 
    </ContentTemplate> 
</asp:UpdatePanel> 

まず、私は、BackgroundWorkerの

Default.aspxのを試してみました

Default.aspx.cs:

protected void btn1_Click(object sender, EventArgs e) 
{ 
    lbl1.Text = "Generating"; 

    var bgw = new BackgroundWorker(); 

    bgw.DoWork += (_, __) => 
    { 
     // This Sleep represents time used for an imaginary task :) 
     Thread.Sleep(5000); 
    }; 
    bgw.RunWorkerCompleted += (_, __) => 
    { 
     lbl1.Text = "Generated"; 
    }; 
    bgw.RunWorkerAsync(); 
} 

のみタスクが終了したときに "生成" と表示されますが、ない「のGeタスクの開始時に「ネーティング」します。

は、私は代わりにタスクを使用してみました:

protected void btn1_Click(object sender, EventArgs e) 
{ 
    lbl1.Text = "Generating"; 
    this.MyTaskEvent += _Default_MyTaskEvent; 
    Task task1 = Task.Factory.StartNew(new Action(DoWork)); 
} 

private void DoWork() 
{ 
    Thread.Sleep(5000); 
    MyTaskEvent?.Invoke(); 
} 

private void _Default_MyTaskEvent() 
{ 
    lbl1.Text = "Generated"; 
    // Response.Redirect("Default.aspx"); 
} 

をしかし、この場合にのみ、「生成」のテキストが表示されますが、それはタスクが終了したとき、「生成」するために変更されません。 また、私はResponse.Redirect( "Default.aspx")を入れてみました。 _Default_MyTaskEvent()の最後に "応答がこのコンテキストでは利用できません"のようなものがあります。

私は思っていたほど簡単ではないと思っています。 何かを忘れている、間違っているとか、これは私が取るべきアプローチではない?

答えて

0

UpdateProgressコントロールを見てください。または、UIを変更するためにjavascript(更新パネルはjsを使用)を使用します。

0

あなたがのUpdatePanelを使用しているので、以下のよう@wazzによって推奨されるのUpdateProgressコントロールを使用します。

<asp:UpdateProgress ID="updProgress" 
    AssociatedUpdatePanelID="UpdatePanel1" 
    runat="server"> 
     <ProgressTemplate>   
     <img alt="progress" src="images/progress.gif"/> 
      Processing...   
     </ProgressTemplate> 
    </asp:UpdateProgress> 

その後、あなたのボタンクリックイベントでは、あなたが電話を待つと方法非同期他のasp.netを作成する必要があります。メソッドが完了したときはわかりません。

protected async void btnTest_Click(object sender, EventArgs e) 
{ 
    Task task1 = Task.Factory.StartNew(new Action(DoWork)); 
    // do other stuff 
    await task1; 
} 
関連する問題