从 Task.Factory 更新 GUI

Update GUI From Task.Factory

我正在使用 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 类型,同样发生了。

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

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

编辑:刚刚意识到您正在使用 asp.net。我假设您使用的是网络表单的措辞。基本上忽略整个UI 线程内容。它不适用于你。事实上,如果这是在页面加载时,那么使用任务的价值就很小。

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

您目前看到的可能是让页面呈现,然后尝试修改内容。来不及了。

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