我正在使用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类型同样的事情。
答案 0 :(得分:0)
您需要长时间运行的工作,并在单独的任务中更新UI。原因是长期运行的g任务不应该在UI线程上,但更新必须是本质上的。所以使用continuewith是一种非常常见的模式。
当您使用continuewith时,请确保将ui上下文作为调度程序传递。所以,从UIthread(重要!)Do task.ContinueWith传递taskscheduler.fromcurrentsynchronizationcontext作为可选的任务调度程序参数。
编辑:刚刚实现了你使用asp.net。我假设您使用的是Web表单。基本上忽略整个UI线程内容。它不适用于您。实际上,如果这是在页面加载上,则根本没有使用任务的价值。
无论哪种方式,您都需要暂停页面的其余处理才能正常工作。
您目前看到的可能是您让页面呈现,然后尝试修改内容。这样做太晚了。
您需要在客户端级别异步才能实现所需,然后返回JSON / JavaScript。无法使Web表单页面异步执行其正常加载,它必须呈现或不呈现。