我在Page_Load事件上调用了一组方法 一些方法最终调用Web服务。大多数方法按顺序[一个接一个]顺序执行,因为一个方法的输出是另一个方法的输入。
但是,在这些服务调用之间可以运行的方法很少。因为,所有操作都需要相当长的时间才能执行,所以我尝试以异步方式运行其中一些操作,以便很少有并行运行。
但是,如果我在回调函数中设置这些控件,我没有成功更新UI上的控件,因为我猜,回调本质上是在主“页面回发请求”主题的不同线程中运行的。有没有办法可以在回调方法中设置我的控件,然后在UI上异步更新它们。这是代码示例:
public partial class _Default : System.Web.UI.Page
{
public delegate string foo(string param1, string param2, ArrayList list, out ArrayList outList);
protected void Page_Load(object sender, EventArgs e)
{
Thread.Sleep(1000);
txtTextSync.Text = "my control";
CallOperationAsync();
Thread.Sleep(1000);
Thread.Sleep(1000);
}
private void CallOperationAsync()
{
foo dlgt = new foo (this.LongRunningMethod) ;
ArrayList inArrList = new ArrayList();
inArrList.Add(233);
ArrayList outArrList = new ArrayList();
// Create the callback delegate.
AsyncCallback asyncCallback = new AsyncCallback(MyAsyncCallback);
// Initiate the Asynchronous call passing in the callback delegate
// and the delegate object used to initiate the call.
IAsyncResult ar = dlgt.BeginInvoke("zorik", "zorik2", inArrList, out outArrList, asyncCallback, dlgt);
}
public void MyAsyncCallback(IAsyncResult ar)
{
string s ;
ArrayList outArrList;
// Because you passed your original delegate in the asyncState parameter
// of the Begin call, you can get it back here to complete the call.
foo dlgt = (foo) ar.AsyncState;
// Complete the call.
try
{
s = dlgt.EndInvoke(out outArrList, ar);
}
catch
{
}
}
private string LongRunningMethod(string param1, string param2, ArrayList list, out ArrayList outList)
{
Thread.Sleep(5000);
outList = new ArrayList();
outList.Add(8999);
list.Add(678);
// this control is inside update panel
txtAsync.Text = "Async";
updPnl1.Update();
return "Xrensuccess";
}
protected void Page_PreRender(object s, EventArgs e)
{
string a = "";
}
}
答案 0 :(得分:1)
为什么不使用ajax来更新控件的数据必须迟到?异步流在asp.net中不起作用,就像我猜的那样在Windows窗体上。您可以在页面的不同部分显示“loading ..”,并在服务器端代码中执行任何操作(在ajax调用期间),其中一个线程在另一个线程上等待,等等。
答案 1 :(得分:0)
您不能这样做,因为当异步操作完成时,已经呈现了启动操作的页面。因此,服务器没有任何要更新的内容。
所有更新都应由浏览器启动。您可以从页面创建一些定期查询请求以获取更新,对于eaxample,使用AJAX
答案 2 :(得分:0)
function Async() {
var url = "http://mydomain.com/default.aspx?arr=12345";
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.async = true;
script.type = 'text/javascript';
script.src = url;
head.appendChild(script);
}
使用ClientScriptManager
试试这个!!!