【发布时间】:2014-02-23 00:32:39
【问题描述】:
哟,我创建了一个 WebProject 来测试是否可以创建一个 asyncTask 来更新进度条:
public partial class AsyncTest : System.Web.UI.Page
{
private String _taskprogress;
private AsyncTaskDelegate _dlgt;
protected delegate void AsyncTaskDelegate();
protected void Page_Load(object sender, EventArgs e)
{
}
public String GetAsyncTaskProgress()
{
return _taskprogress;
}
public IAsyncResult OnBegin(object sender, EventArgs e,
AsyncCallback cb, object extraData)
{
_taskprogress = "AsyncTask started at: " + DateTime.Now + ". ";
_dlgt = new AsyncTaskDelegate(ReadFile);
IAsyncResult result = _dlgt.BeginInvoke(cb, extraData);
return result;
}
public void ReadFile()
{
try
{
string Filename = @"D:\Material.txt";
int filelength = TotalLines(Filename); //just reads the lines of the file
ProgressBar1.Maximum = filelength;
using (StreamReader reader = new StreamReader(Filename))
{
string line;
int actualfileline = 1;
while ((line = reader.ReadLine()) != null)
{
string test = line;
ProgressBar1.Value = actualfileline;
actualfileline++;
//UpdatePanel1.Update(); <- Doesnt work
System.Threading.Thread.Sleep(5);
}
}
}
catch (Exception ex)
{
string exm = ex.Message.ToString();
}
}
protected void Button1_Click(object sender, EventArgs e)
{
OnBegin(this, null, null, null);
}
}
Aaa 和我的 aspx 代码:(我当然也有一个脚本管理器)
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Button runat="server" ID="btnDoTask" Text="Do Task" OnClick="Button1_Click" />
<br />
<br />
<eo:ProgressBar ID="ProgressBar1" runat="server" Width="250px"
BackgroundImage="00060301" BackgroundImageLeft="00060302"
BackgroundImageRight="00060303" ControlSkinID="None" IndicatorImage="00060304">
</eo:ProgressBar
</ContentTemplate>
</asp:UpdatePanel>
调用 Updatepanel1.Update() 不起作用,因为它说:
只能调用Update-methhoe进行渲染
那么我还能如何更新它呢? 我希望用户在进度条上看到进度——因为我想实现更大的文件读取代码。 我对异步编程真的很陌生,所以我不确定是否有你需要的一切:/
编辑:
好的,现在我在我的页面中创建了一个 Web 服务:
[System.Web.Services.WebMethod]
[System.Web.Script.Services.ScriptMethod]
public string GetProcess()
{
if (actualfileline != null)
{
return actualfileline.ToString();
}
else
{
return "0";
}
}
我想通过我的 Button 来称呼它:
<asp:Button runat="server" ID="btnDoTask" Text="Do Task" OnClick="Button1_Click" OnClientClick="StartJavaScriptProgress()" />
javascript部分:
function StartJavaScriptProgress()
{
var elm = document.getElementById("LabelProgress");
elm.innerText = "Currently Working ...";
setTimeout(WebService(), 1000);
};
function WebService() {
$.ajax(
{
type: "POST",
url: "AsyncTest.aspx/GetProcess",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (response) {
alert("Worked");
var elm = document.getElementById("ProgressBar1");
elm.value = response.d;
},
error: function (jqXHR, textStatus, errorThrown) {
alert("Error starting process");
}
})
};
但它不起作用......
【问题讨论】:
标签: c# asp.net asynchronous postback