从ASP.NET异步调用方法,然后在UI上更新控件

时间:2012-01-26 07:12:58

标签: c# asp.net .net

我在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 = "";
    }
}  

3 个答案:

答案 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

从服务器端代码注册该功能

试试这个!!!