从Task.Factory更新GUI

时间:2015-02-26 12:00:42

标签: c# asp.net task

我正在使用ASP.Net,我想要实现的是我有一个我调用的服务,在调用服务之前我操作一些UI控件,在服务完成后我再次操作UI控件。

问题是UI控件值永远不会在Task.Factory的主体中更改(服务调用完成后)并且没有触发异常。

这是我的代码:

            try
        {
            Task ocrTask = Task.Factory.StartNew(() =>
            {
                OCRResult result = new OCRServiceHandler().Start(image);
                if (string.IsNullOrEmpty(result.Error))
                {
                    ViewState["OCRResult"] = result;

                    lbl_Status.Text = string.Empty;
                    div_Result.Visible = true;
                }
                else
                {
                    ViewState["OCRResult"] = null;

                    lbl_Status.Text = result.Error;
                    div_Result.Visible = false;
                }

                //Clear upload file
                myFile.Attributes.Clear();

                //Hide processing image
                img_Processing.Visible = false;
            }, CancellationTask.None, TaskCreationOptions.None, uiScheduler);
        }
        catch (Exception ex)
        {
            throw ex;
        }

我已经尝试过使用ContinueWith并更新那里的UI控件但结果相同,我也尝试过使用ThreadStart,但同样的结果,我也尝试过改变TaskScheduler类型同样的事情。

1 个答案:

答案 0 :(得分:0)

您需要长时间运行的工作,并在单独的任务中更新UI。原因是长期运行的g任务不应该在UI线程上,但更新必须是本质上的。所以使用continuewith是一种非常常见的模式。

当您使用continuewith时,请确保将ui上下文作为调度程序传递。所以,从UIthread(重要!)Do task.ContinueWith传递taskscheduler.fromcurrentsynchronizationcontext作为可选的任务调度程序参数。

编辑:刚刚实现了你使用asp.net。我假设您使用的是Web表单。基本上忽略整个UI线程内容。它不适用于您。实际上,如果这是在页面加载上,则根本没有使用任务的价值。

无论哪种方式,您都需要暂停页面的其余处理才能正常工作。

您目前看到的可能是您让页面呈现,然后尝试修改内容。这样做太晚了。

您需要在客户端级别异步才能实现所需,然后返回JSON / JavaScript。无法使Web表单页面异步执行其正常加载,它必须呈现或不呈现。