Лучший способ обновить Web.UI.Page в ответ на обратный вызов из другого потока - PullRequest
0 голосов
/ 17 февраля 2011

Каков наилучший способ выполнить следующее в жизненном цикле веб-страницы?

    protected void btnTestAsync_Click(object sender, EventArgs e)
    {
        this.MainThreadID = Thread.CurrentThread.ManagedThreadId;
        TestBLL bl = new TestBLL();
        bl.OnBeginWork += OnBeginWork;
        bl.OnEndWork += OnEndWork;
        bl.OnProgressUpdate += OnWork;
        ThreadStart threadDelegate = new ThreadStart(bl.PerformBeginWork);
        Thread newThread = new Thread(threadDelegate);
        newThread.Start();
     }

Затем в OnWorkEvent я ввожу:

 private  void OnWork(AsyncProgress workProgress, ref bool abortProcess)
    {
        string s = String.Format("MAIN TREAD: {0} WORKER THREAD: {1} COUNT :{2} COMPLETE: {3} REMAINING: {4}", 
                                this.MainThreadID, 
                                workProgress.ThreadID, 
                                workProgress.NumberOfOperationsTotal, 
                                workProgress.NumberOfOperationsCompleted, 
                                workProgress.NumberOfOperationsRemaining);
        lbl.Text = s;
        lb.Items.Add(s);
        //.ProcessMessages(); Response.Redirect???<-- Here I want to rfresh the page. During debug the test variables are proper
    }

Прошу прощения за мое неведениеЯ никогда не делал этого с Web.UI.Page.Каков наилучший способ обновления пользовательского интерфейса из обратного вызова делегата в другом потоке?

Спасибо,

1 Ответ

1 голос
/ 17 февраля 2011

Я бы предложил AJAX.

Нажатие кнопки приведет к обратной передаче браузера. С этого момента нет ничего действительно, чтобы «заставить» браузер (на стороне клиента) сделать другую обратную передачу, если пользователь «что-то не делает»

Используя ajax, вы можете выполнять асинхронный вызов, который будет отвечать после его завершения.

Есть несколько способов сделать это, но я лично использую jquery.

вот пример возможного вызова ajax с использованием jquery:

$.ajax({
    url: "../ajax/backgroundworker.ashx",
    data: 'element=' + $(this).parent().siblings('.datarow').children('.dataelement').text(),
    dataType: "text",
    success: function(data) {
        var taData = data.split("|");
        if (taData[0] != "-1") {

            $(".dataelement:contains('" + taData[0] + "')").parent().siblings().children('.displayfield').text(taData[1]);
            $(".dataelement:contains('" + taData[0] + "')").parent().siblings().children('.img_throbber').css('visibility', 'hidden');
        }
        else {
            alert("There is currently a problem accessing the background service that is responsible for data processing.");
            $('.do_work_button').css("visibility", "hidden");
            $(".dataelement").parent().siblings().children('.dataelement').text("N/A");
            $(".dataelement").parent().siblings().children('.img_throbber').css('visibility', 'hidden');
        }
    },
    error: function(xhr, status, error) {
        displayAjaxError(xhr);
        $(".dataelement").parent().siblings().children('.img_throbber').css('visibility', 'hidden');
    }

команда $ .ajax вызывается с событием click на вашей странице. и .ashx (файл веб-обработчика asp.net) является своего рода средством, которое вы можете использовать для передачи данных со своей клиентской стороны на серверную. Вы можете ссылаться на объекты и код на стороне сервера в .ashx, которые используют данные из ajax-вызова на стороне клиента для возврата результатов через контекст http.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...